필드 옵션
각각의 필드는 특정 필드 별 argument 집합을 사용한다. 예를들면 CharField
는 max_length
argument를 요구한다 - max_length
는 데이터를 저장하는데 사용되는 VARCHAR
데이터베이스 필드의 크기를 지정하는 argument이다.
모든 필드 타입에 공통적으로 이용가능한 argument 집합이 있다. 모든 것은 선택적이다. 레퍼런스에서 전부 설명되어있다. 여기서는 가장 자주 많이 쓰이는 것을 요약한다
null
만약에 True
이면, 장고는 db 상에서 NULL을 빈 값으로써 저장할 것이다. 기본값은 False
이다
blank
만약에 True
이면, 이 필드는 블랭크가 되는 것이 허락된다. 기본 값은 False
이다.
알아 두어야 할 점은 null
과는 다르다는 것이다. null
은 데이터베이스와 관련있는 반면에, blank
은 좀 더 validation과 관련 있다 만약 필드가 blank=True
라면 폼 유효성은 빈값이 되는 것을 허용해줄 것이다. 만약에 필드가 blank=False
라면 필드는 무조건 값이 채워져야 한다
choices
필드의 선택 사항으로 사용 할 2- 튜플 시퀀스이다. 이게 주어지면, 기본 폼 위젯은 텍스트 필드 대신에 셀렉박스가 될 것이고 주어진 선택사항으로 선택이 제한될 것이다.
xxxxxxxxxx
YEAR_IN_SCHOOL_CHOICES = [
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
]
Note
위 선택사항들의 순서가 변경될 때 마다 새 마이그레이션이 생성된다.
튜플의 첫번째 요소는 데이터베이스에 저장될 값이다. 두번째 요소는 필드폼 위젯으로써 표시된다
모델 인스턴스가 주어질 때, 선택사항과 관련된 필드에 대해 보여지는 값은 get_FOO_display()
메소드로 접근 될 수있다. 예를 들면,
xxxxxxxxxx
from django.db import models
class Person(models.Model):
SHIRT_SIZES = (
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
)
name = models.CharField(max_length=60)
shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
xxxxxxxxxx
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
당신은 선택사항을 정의하는데 간결한 방법으로 Enumeration 클래스를 사용할 수 있다
xxxxxxxxxx
from django.db import models
class Runner(models.Model):
MedalType = models.TextChoices('MedalType', 'GOLD SILVER BRONZE')
name = models.CharField(max_length=60)
medal = models.CharField(blank=True, choices=MedalType.choices, max_length=10)
추가적인 예제는 모델 필드 레퍼런스 에서 이용 가능하다
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 이다. 만약에 값을 바꾼다면, 새로운 객체는 이전 것 옆에 새로 하나 더 생성할 것이다.
xxxxxxxxxx
from django.db import models
class Fruie(models.Model):
name = models.CharField(max_length=100, primary_key=True)
xxxxxxxxxx
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
<QuerySet ['Apple', 'Pear']>
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
vsblank
이 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
'개발 > 장고' 카테고리의 다른 글
[해설과 함께 읽는 Django 문서] Models - 다 대 다 관계 (0) | 2021.01.29 |
---|---|
[해설과 함께 읽는 Django 문서] Models - 다 대 일 관계 (0) | 2021.01.27 |
[해설과 함께 읽는 Django 문서] Models - Verbose Field 이름 (0) | 2021.01.24 |
[해설과 함께 읽는 Django 문서] Models - Automatic primary key 필드 (0) | 2021.01.24 |
[해설과 함께 읽는 Django 문서] Models - Quick example, Using models (0) | 2021.01.20 |