null
기본값은 False
💡 CharField와 TextField 같은 문자열 기반 필드에는 null을 사용하지 않는다.
null=True
로 정의하면 '데이터 없음'에 대한 두가지 값 즉,None
과 빈 문자열을 갖게 된다.
이는 중복으로 장고 컨벤션은 null이 아닌 빈 문자열을 사용한다.blank = True
blank
기본값은 False
💡null과 blank
null
은 데이터베이스와 관련이 있다. 데이터베이스 column이 null 값을 가질지를 정의한다.
blank
는 validation(유효성) 관련이다.
default
필드의 기본값을 지정해준다.
primary_key
primary_key = True
면 해당 필드를 기본키로 설정한다.
기본키를 설정하지 않으면 자동적으로 고유한 정수값을 가지는 id
기본키 필드가 생성된다.
unique
unique = True
면 필드가 항상 고유한 값만 가지도록 설정한다.
동일한 값을 생성하려고 할 경우 IntegrityError
가 발생한다.
ManyToManyField
와 OneToOneField
에는 사용할 수 없다.
필드를 외래키로 설정한다.
관계 설정 대상이 되는 모델과 참조하는 객체가 삭제 시 처리 방식을 필수로 설정해줘야 한다.
자기 참조의 경우 self
지정
ForeignKey(to, on_delete, **options)
class Menu(models.Model):
name = models.CharField(max_length = 50)
class Category(models.Model):
name = models.CharField(max_length = 50)
menu = models.ForeignKey('Menu', on_delete = models.SET_NULL, null = True)
on_delete
CASCADE
ForeignKey('self', on_delete = models.CASCADE)
SET_NULL
ForeignKey('self', on_delete = models.SET_NULL, null = True)
SET_DEFAULT
ForeignKey('self', on_delete = models.SET_DEFAULT, default = 0)
PROTECT
ForeignKey('self', on_delete = models.PROTECT)
관계 설정 대상이 되는 모델을 필수로 설정해줘야 한다.
장고는 중간테이블을 자동으로 생성한다. 하지만 직접 중간테이블을 만들면 through
를 지정해야 한다.
class Drink(models.Model):
name = models.CharField(max_length = 50)
allergy = models.ManyToManyField('Allergy', through = 'AllergyDrink')
class Meta:
db_table = 'drinks'
class Allergy(models.Model):
name = models.CharField(max_length = 50)
class Meta:
db_table = 'allergies'
class AllergyDrink(models.Model):
allergy = models.ForeignKey('Allergy', on_delete = models.CASCADE)
drink = models.ForeignKey('Drink', on_delete = models.CASCADE)
class Meta:
db_table = 'allergies_drinks'
관계 설정 대상이 되는 모델과 참조하는 객체가 삭제 시 처리 방식을 필수로 설정해줘야 한다.
class Drink(models.Model):
name = models.CharField(max_length=50)
nutrition = models.OneToOneField('Nutrition', on_delete=models.SET_NULL, null=True)
class Meta:
db_table = 'drinks'
class Nutrition(models.Model):
one_serving_kcal = models.DecimalField(max_digits=10, decimal_places=2)
sodium_mg = models.DecimalField(max_digits=10, decimal_places=2)
saturated_fat_g = models.DecimalField(max_digits=10, decimal_places=2)
class Meta:
db_table = 'nutritions'
BigIntegerField
BigIntergerField(**options)
BooleanField
BooleanField(**options)
True/False 필드다.
null 값 허용이 필요하다면, 이 필드 대신 NullBooleanField
를 사용해야 한다.
Field.default 가 정의되지 않았을 때 BooleanField
의 기본값은 None 이다.
CharField
CharField(max_length = None, **options)
작은 문자열에서 큰 사이즈의 문자열을 위한 문자열 필드다.
많은 양의 텍스트일 경우 TextField
를 사용한다.
max_length
최대길이(문자 수) byte로 정의. (utf-8에서 한글은 3 byte)
DateField
DateField(auto_now = False, auto_now_add = False, **options)
auto_now_add
객체가 처음 생성될 때 자동으로 현재 시간이 설정된다.
auto_now
객체가 저장될 때마다(.save()
) 자동으로 현재 시간이 설정된다.
DateTimeField
DateTimeField(auto_now = False, auto_now_add = False, **options)
DecimalField
DecimalField(max_digits = None, decimal_places = None, **options)
max_digits
숫자에 허용되는 최대 자릿수이다.
decimal_places
숫자와 함께 저장될 소수 자릿수이다.
EmailField
EmailField(max_length = 254, **options)
유효한 이메일 주소인지 체크하는 CharField
다. 입력값을 검증하는데 EmailValidator를 사용한다.
FloatField
FloatField(**options)
FloatField
는 내부적으로 python의 float 타입을 사용하지만, DecimalField
는 python의 decimal 타입을 사용한다.
IntegerField
IntegerField(**options)
NullBooleanField
NullBooleanField(**options)
BooleanFiel
에 null = True
대신에 사용한다.
PositiveIntegerField
PositiveIntegerField(**options)
IntegerField
와 비슷하지만 0 또는 양수이어야 한다.
PositiveSmallIntegerField
PositiveSmallIntegerField(**options)
SmallIntegerField
SmallIntegerField(**options)
TextField
TextField(**options)
TimeField
TimeField(auto_now = False, auto_now_add = False, **options)
URLField
URLField(max_length = 200, **options)
URL을 위한 CharField
다.