Juhans
article thumbnail
Published 2022. 11. 19. 02:12
[Django] 장고 Model 활용

Django Field

이전 글에서 장고의 모델을 활용해서 DB와 웹 서버를 연결하는 과정을 보았다. 장고의 모델에서 정의하는 Field를 통해 DB table에 우리가 원하는 속성 Column을 만들어줄 수 있었다.

 

Field의 종류

 

field 종류

Field의 종류에는 위와 같이 수많은 종류들이 있다. 모두 외우기에는 어렵기 때문에 대략적인 분류만 인지하고 필요할 때 보고 가져다쓰기로 하자.

 

먼저 숫자 Field에서 자동값 증가 필드(Auto)는 3가지로 모두 같은 기능이지만 숫자의 범위를 지정해주는 탓에 다른 이름의 Field로 불린다. 나머지 숫자 필드에서도 음, 양, 크기에 따라 다양한 field가 존재한다.

 

문자열 Field는 어떤 문자열을 저장할 때 크기를 가변, 고정적으로 정할지, 어떤 종류의 문자열을 정할지에 따라 다양하게 나뉘게 된다. 

 

날짜/시간 Field는 문자 그대로 날짜와 시간에 따른 정보를 저장하기 위한 field이다.

 

Null/Boolean Field는 null값이나 참/거짓에 대한 여부를 저장하기 위해 쓰인다.

 

마지막으로 FileField인데 파일을 정의할 수 있는 모델을 만들기 위해서 사용된다.

 

굉장히 빈약한 설명으로 field의 종류를 알아봤는데 장고 공식 documentation이나 다른 정리 글을 확인해보면 더 자세한 내용을 확인할 수 있다.

 

https://docs.djangoproject.com/en/4.1/ref/models/fields/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

https://velog.io/@qlgks1/Django-Model-%ED%95%84%EB%93%9Cfiled-%EB%AA%A8%EC%9D%8C%EC%A7%91

 

Django Model - 필드(filed) 모음집

장고 Model - ORM에서 사용하는 Field 리스트 살펴보기. 장고 모델 - 필드 공식 문서와 사용 경험과 다른 문서를 참조해서 총 망라 형식으로 정리했습니다.

velog.io


Field의 옵션

Field는 DB에 ORM으로 처리되는 과정에서 넘겨야하는 것이 또 하나 존재한다. 바로 제약조건이다. 이는 DB에서 생성문을 통해 Schema를 정의할 때도 등장하는 개념이다. 어떤 table의 column을 정의할 때 해당 column의 unique여부, null 가능여부, Primary Key 여부, default 지정, validators로 유효성 확인 지정 등을 수행할 수 있다.

 

이외에 장고 모델에서만 사용되는 옵션이 있다. 이 옵션들은 위의 제약조건과 같은 인자처럼 사용되지만 실제 DB 추가과정에는 전혀 사용되지 않는 옵션이다.

 

Field 제약 조건

  • null : null 옵션은 해당 column이 null을 가질 수 있는지 없는지에 대한 여부를 나타낸다. (True or False) False일 때 반드시 입력되어야함.
  • blank : blank 옵션은 null과 반대되는 개념으로 not null 제약조건에 대한 여부를 나타낸다. 즉, True일 때 Not Null 제약조건이므로 반드시 입력되어야 한다.
  • default : 기본적으로 입력되는 값을 정할 수 있다. 만약 이 instance의 column data에 어떤 값도 넣지 않았다면 null로 지정되는 것이 아니라 default로 넣은 값이 자동적으로 들어가게 된다.
  • unique : 다른 컬럼 값들과 비교했을 때 완전히 다른 값을 가져야 한다. 
  • unique_for_date : 다른 컬럼의 시간 데이터와 다른 시간 데이터를 가져야 한다. 옵션의 값은 DateField 또는 DateTimeField 객체의 이름으로 지정한다.
  • primary key : PK는 해당 table에서 instance들을 구분할 수 있는 가장 대표적인 column으로 not null과 unique한 제약조건이 자동적으로 들어간다.
  • choices : choices는 입력되는 값들이 choices에서 지정한 값들 범위 안에서만 허용된다.
  • validators : validators의 입력값은 함수로, 유효성을 체크하기 위한 목적으로 사용된다.

DB 정보

  • db_column : 모델의 field 이름, 즉, 변수의 이름이 그대로 DB의 column명으로 사용된다.
  • db_index : True로 지정하면 필드에 대한 DB index가 생성된다.

Form 정보

Form 정보는 위에서도 언급했지만 Column을 채울 때, 즉, 웹에서 Form을 채울 때 사용자에게 어떤 정보를 주기 위해 또는 어떤 기능을 하기 위해서만 존재하고 실제 DB와는 아무 상관이 없다.

  • editable : False로 지정된 필드는 HTML Form에서 비활성화되어 표시된다. 즉, 해당 column 입력을 막아놓는다.
  • error_messages : form에서 DB에 추가될 데이터를 입력받았을 때 그 데이터가 유효하지 않아 DB에 추가될 수 없다면 error를 표시해야한다. 그 error 표시에 사용되는 message.
  • help_text : form에서 DB 데이터를 입력받을 때 입력 블럭 하단이나 상단, 또는 좌우에 사용자가 입력할 때 도움될만한 정보를 text로 표시한다.
  • verbose_name : form에서 DB에 추가할 instance를 입력받을 때 form에 표시되는 text를 의미한다.

 

이 verbose_name 옵션이 이해가 잘 가지 않았는데 실습을 해보니 바로 이해가 됐다.

이렇게 정의된 model이 있다고 하면 대부분의 Field 맨 처음 인자가 어떤 text인 것이 보일 것이다. 이 부분이 verbose_name 옵션으로 실제 form에서 입력받는 부분에 나타나는 text이다. 또 verbose_name말고 'label'로도 많이 사용된다. (verbose_name으로도 물론 사용된다!!)

 

Model에서는 인자없이 가장 처음 인자로 사용되기도 한다.

(인자이름이 달라서 꽤나 헤맸다. ㅠㅠ)


모델의 관계

DB의 Schema에서도 관계는 정의되어있다. 보통 1:N (1대다) 관계, 1:1 관계, N:N (다대다) 관계로 나뉜다. 물론 장고의 모델에서도 모델끼리(table끼리)의 관계를 정의할 수 있다. 1:N관계에서는 부모-자식관계이므로 FK를 상속받는 방식으로, 1:1에서는 한 Column을 공유하는 방식으로 이루어진다. 

 

모델의 관계를 설정할 때는 아래의 3개 Field를 정의함으로써 설정이 가능하다.

  • ForeignKey
  • ManyToManyField
  • OneToOneField

모델의 Column들이 연결되어 있기 때문에 만약 연결되어 있는 table이나 instance가 사라진다면 해당 instance의 일부 column을 상속 또는 연결되어 있는 다른 table의 instance를 어떻게 처리할지 정해줘야 한다. 그것이 on_delete 인자다.

 

이 'on_delete' 인자는 ForeignKey와 OneToOneField에서만 사용가능하다.

왜냐하면 다대다관계(ManyToManyField)에서는 하나의 instance가 사라지더라도 영향을 받지 않기 때문!

예를 들어 Blog와 Tag와의 관계에서 Blog와 Tag는 다대다 관계를 가지는데 Blog가 하나 삭제되더라도 Tag가 그 Blog가 사라짐에따라 같이 삭제되지 않아도 괜찮고 그 반대의 경우도 괜찮다.

 

ForeignKey, ManyToManyField, OneToOneField 모두 사용하는 인자가 하나 있는데 그것이 'to'라는 인자다. 이 인자는 어떤 모델과 연결되어 있는지 작성하는 부분이다.

'to'인자는 ForeignKey에서는 자식에 해당하는 model에 작성해야하고 작성할 때는 부모 model의 이름을 넣어주면 된다.

나머지 ManyToManyField와 OneToOneField에서는 관계 연결할 두 모델 중 임의의 모델에 상대의 모델 이름을 넣어주면 된다.

 

아래는 on_delete 인자 값들이다.

  • CASCADE : 참조 인스턴스 삭제시 함께 삭제함
  • PROTECT : 참조 인스턴스 삭제시 ProtectedError를 발생시켜 삭제를 방지함 - RESTRICT: 참조 인스턴스 삭제시 IntegrityError를 발생시켜 삭제를 방지함. 
  •  SET_NULL : 참조 인스턴스 삭제시 null=True 옵션이 설정된 경우에 null 값으로 변경함. -     SET_DEFAULT : 참조 인스턴스 삭제시 default 옵션에 지정한 값으로 변경함
  • SET_DEFAULT : 참조 인스턴스 삭제시 default 옵션에 지정한 값으로 변경함
  • SET() : set의 인자로 함수를 지정함. 참조 인스턴스 삭제시 인자로 지정한 함수를 호출하여 반환값으로 참조 필드 값을 변경함
  • DO_NOTHING : 참조 인스턴스 삭제시 어떤 작업도 하지 않음. DB에 따라 참조 무결성 오류가 발생할 수 있음

각 Field의 특징을 보자.

  • OneToOneField : 한 모델의 인스턴스와 한 모델의 인스턴스가 연결되는 과정이므로 한 인스턴스에 연결되는 인스턴스가 2개 이상이 될 수 없다.

예를들어 model Profile과 User가 1대1로 연결되어 있는 상태라면 위와 같이 같은 user01과 연결되는 instance를 왼쪽 위에 먼저 하나 만들고 아래처럼 또 하나 만들 수는 없다.

 

  • ManyToManyField : 다대다 관계에서는 관계를 좀 더 단순화하기 위해 table과 table 사이에 1대다 관계를 가지는 한개의 table을 가진다. 장고 모델에서는 따로 생성되지 않지만 실제 DB 내부에서는 중간 다리 역할을 하는 새로운 table이 생성된다.

위에서 보이는 것처럼 Tag와 Post를 ManyToManyField로 관계 설정해줬다. 이 관계 때문에 DB 생성시 이 두 table의 중간다리 역할을 하는 table이 추가로 생성된다.

post와 tag를 잇는 blog_post_tag라는 table이 자동적으로 생성되었다. 이 table에서는 post의 column인 post_id, tag의 column인 tag_id가 포함되어있다.

 

ManyToManyField 추가 Tip!

ManyToManyField에서는 상대 Tag를 넣어줄 때 위 예시처럼 string형태('Tag')로 건네줘야한다. 이는 DB 내부에서 직접적으로 상대 table과 연결되는 것이 아니라 중간다리 역할의 table을 거쳐 연결되기 때문이라고 한다.

 


reference

https://stackoverflow.com/questions/13248122/how-to-add-verbose-name-to-forms

 

How to add verbose_name to forms

How to add verbose_name to forms in Django? In forms.py: class SendOrderForm(forms.Form): send_option = forms.ModelChoiceField(queryset=Send.objects.all(), verbose_name="Send Options") This i...

stackoverflow.com

https://www.geeksforgeeks.org/verbose_name-django-built-in-field-validation/

 

verbose_name - Django Built-in Field Validation - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://velog.io/@qlgks1/Django-Model-%ED%95%84%EB%93%9Cfiled-%EB%AA%A8%EC%9D%8C%EC%A7%91

 

Django Model - 필드(filed) 모음집

장고 Model - ORM에서 사용하는 Field 리스트 살펴보기. 장고 모델 - 필드 공식 문서와 사용 경험과 다른 문서를 참조해서 총 망라 형식으로 정리했습니다.

velog.io

https://hoorooroob.tistory.com/entry/%ED%95%B4%EC%84%A4%EA%B3%BC-%ED%95%A8%EA%BB%98-%EC%9D%BD%EB%8A%94-Django-%EB%AC%B8%EC%84%9C-Models-Verbose-Field-%EC%9D%B4%EB%A6%84

 

[해설과 함께 읽는 Django 문서] Models - Verbose Field 이름

원문 링크한국어로 옮기기 어색한 단어들은 영문으로 혹은 해석이 애매한 구절은 직역한 그대로 사용 하였습니다.Verbose field 이름ForeignKey, ManyToManyField, OneToOneField 를 제외하면, 각각 필드 타입은

hoorooroob.tistory.com

 

'' 카테고리의 다른 글

[Django] URL Reverse  (0) 2022.11.19
[Django] 장고 Form  (0) 2022.11.19
[Django] 장고 ORM  (2) 2022.11.19
[Django] Template 템플릿  (0) 2022.11.15
[Django] 장고 기초, View와 Model  (6) 2022.11.14