본문 바로가기

개발/장고

[해설과 함께 읽는 Django 문서] Models - 필드옵션

반응형
Models_field_option

필드 옵션

각각의 필드는 특정 필드 별 argument 집합을 사용한다. 예를들면 CharFieldmax_lengthargument를 요구한다 - max_length는 데이터를 저장하는데 사용되는 VARCHAR 데이터베이스 필드의 크기를 지정하는 argument이다.

모든 필드 타입에 공통적으로 이용가능한 argument 집합이 있다. 모든 것은 선택적이다. 레퍼런스에서 전부 설명되어있다. 여기서는 가장 자주 많이 쓰이는 것을 요약한다


null

만약에 True 이면, 장고는 db 상에서 NULL을 빈 값으로써 저장할 것이다. 기본값은 False 이다

blank

만약에 True 이면, 이 필드는 블랭크가 되는 것이 허락된다. 기본 값은 False 이다.

알아 두어야 할 점은 null과는 다르다는 것이다. null 은 데이터베이스와 관련있는 반면에, blank 은 좀 더 validation과 관련 있다 만약 필드가 blank=True 라면 폼 유효성은 빈값이 되는 것을 허용해줄 것이다. 만약에 필드가 blank=False 라면 필드는 무조건 값이 채워져야 한다

choices

필드의 선택 사항으로 사용 할 2- 튜플 시퀀스이다. 이게 주어지면, 기본 폼 위젯은 텍스트 필드 대신에 셀렉박스가 될 것이고 주어진 선택사항으로 선택이 제한될 것이다.

Note

위 선택사항들의 순서가 변경될 때 마다 새 마이그레이션이 생성된다.

튜플의 첫번째 요소는 데이터베이스에 저장될 값이다. 두번째 요소는 필드폼 위젯으로써 표시된다

 

모델 인스턴스가 주어질 때, 선택사항과 관련된 필드에 대해 보여지는 값은 get_FOO_display() 메소드로 접근 될 수있다. 예를 들면,

당신은 선택사항을 정의하는데 간결한 방법으로 Enumeration 클래스를 사용할 수 있다

추가적인 예제는 모델 필드 레퍼런스 에서 이용 가능하다

default

필드를 위한 기본 값이다. 이것은 값이나 호출가능한 객체가 될 수 있다. 만약 호출가능한 객체라면, 이것은 새로운 객체가 생성될 때 마다 호출될 것이다.

help_text

폼 위젯과 함께 보여지는 추가적인 도움 텍스트 이다. 당신의 필드가 폼에서 사용되지 않더라도 문서화에 유용하다

primary_key

만약 True 이면, 이 필드는 모델의 primary Key이다.

명시적으로 primary_key=True 를 해주지 않으면, 장고는 자동적으로 primary key를 잡기 위해서 IntegerField 를 추가할 것이다.만약 기본 primary-key 의 동작을 재정의하고 싶지 않다면, primary_key=True 를 굳이 설정할 필요는 없다. 자세한 것은 Automatic Primary Key 필드 를 보자

primary key 필드는 read-only 이다. 만약에 값을 바꾼다면, 새로운 객체는 이전 것 옆에 새로 하나 더 생성할 것이다.

 

unique

만약 True이면, 이 필드는 테이블 전체에서 unique 해야만 한다. 다시 말하지만, 이것은 가장 일반적인 필드 옵션에 대한 간단한 설명이다. 자세한 내용은 common model field option reference에서 보자

 


 

내 마음대로 해설

null

위 문제서 설명하다시피, null=True 로 지정한다는 것은 실제 DB의 해당 컬럼 값으로 null이 default로 등록이 된다는 것이다. default는 null=False 이고, 이렇게 지정되어있을 때는 저장할 때, 해당필드가 지정되지 않으면 에러가 발생하게 된다.

 

blank

null과는 다르게, blank는 폼 필드 유효성 체크와 좀 더 관련이 많다. 예를들어서, 전화번호 필드에서 blank=True 라면, 웹 화면 상에서 유효성 체크할 때는 공백으로 아무값이 없는 것이 허용이 된다. 반대로 blank=Flase 이면, 폼에 값이 없을 경우 에러를 일으키게 된다.

 

choices

필드에 값을 저장할 때, 실수를 최대한 피하게 해줄 수 있는 방법 중 1개 이다. 단순히 CharField로 지정한다면, 해당 필드에 저장될 수 있는 값은 무궁무진해 지지만, choices 로 Enum 클래스 혹은 튜플을 정해둔다면, 웹 화면상에서는 셀렉박스로 해당하는 값만 보여줌으로써, 저장될 값을 제한 할 수 있다 또한 코드를 보는 사람의 입장에서도 이 필드에 들어올 수 있는 값이 이렇게 정해져있다는 것을 인지할 수 있는 장점이 있다.

 

null vs blank

이 2개 모두 기본 값은 False 이다. 즉, 기본적으로는 모든 필드에 값이 들어있는 것을 기대하도록 한다. 둘다 True 인 경우에는 폼에서도 빈값으로 저장 가능하고, DB 상에서는 이런 경우 null 로 저장됨을 말한다. 일반적으로 폼을 사용하지 않는다고 하였을 때는 null의 True / False 여부만 따지면 되는데, blank는 DB와 관련해서는 영향을 주지 않기 때문이다. 즉, DB 상에서 null 저장을 허락할 것이면, True / 그렇지 않다면 False를 사용하면 된다.

 


 

참조

https://django-orm-cookbook-ko.readthedocs.io/en/latest/null_vs_blank.html

https://stackoverflow.com/a/21812150/11735129

반응형