dev/django

[django] Model - Field options

Jayce_kim 2022. 3. 7. 09:34

필드 옵션은 모든 필드 유형에서 사용될 수 있다

 

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

데이터베이스의 테이블 스페이스 이름