[django] Model - Field options
필드 옵션은 모든 필드 유형에서 사용될 수 있다
null
Field.null
'값이 없음'을 저장함. False가 기본값
CharField, TextField와 같은 문자열 기반 필드에는 사용하지 않는게 좋다
문자열 필드에서 '데이터 없음'이라고 하면 null값이랑 빈 문자열 2가지가 있어 중복되기 때문이다
그래서 장고에서는 null이 아닌 빈 문자열을 사용한다
예외가 있는데 CharField가 unique=True 와 blank=True 속성을 모두 가지고 있는 경우다
이런 경우에는 빈 값으로 여러 개체를 저장할 때 문제가 생긴다
blank로 부여된 '빈 값'이라는 데이터는 unique 속성 때문에 컬럼 전체를 통틀어 1개 밖에 없어야 하기 때문이다
이런 경우에는 null 값으로 저장하면 unique 속성에 위배되지 않기 때문에 사용한다
blank
Field.blank
빈 값을 저장함 False가 기본값
null은 순수하게 DataBase에만 관련이 있는 반면 Blank는 유효성 검사와 관련이 있다
choices
Field.choices
튜플값을 필드로 사용한다 sleect box 소스로 활용된다
튜플의 첫번째 요소는 DB에 저장할 실제값이고 2번째 요소는 사용자에게 보여질 값이다
YEAR_IN_SCHOOL_CHOICES = [
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
]
위와 같이 필드를 미리 설정했을 때 FR,SO 등은 실제로 DB에 저장될 값이고
freshman, sophomore 등은 사용자에게 보여지는 값이다
그리고 아래처럼 그룹화를 할 수도 있다
MEDIA_CHOICES = [
('Audio', (
('vinyl', 'Vinyl'),
('cd', 'CD'),
)
),
('Video', (
('vhs', 'VHS Tape'),
('dvd', 'DVD'),
)
),
('unknown', 'Unknown'),
]
위 예시들처럼 필드를 미리 정의했다면 아래처럼 CharField에 사용하는 것이 일반적이다
from django.db import models
class Student(models.Model):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
GRADUATE = 'GR'
YEAR_IN_SCHOOL_CHOICES = [
(FRESHMAN, 'Freshman'),
(SOPHOMORE, 'Sophomore'),
(JUNIOR, 'Junior'),
(SENIOR, 'Senior'),
(GRADUATE, 'Graduate'),
]
year_in_school = models.CharField(
max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default=FRESHMAN,
)
def is_upperclass(self):
return self.year_in_school in {self.JUNIOR, self.SENIOR}
db_column
Field.db_column
해당 필드에 사용할 데이터 베이스 열의 이름
따로 지정하지 않을 시에는 필드이름을 사용한다
db.index
Field.db_index
해당 필드에 대한 DB index가 생성됨
기본값은 False
db_tablespace
Field.db_tablespace
데이터베이스의 테이블 스페이스 이름