Django에서 null=True와 blank=True의 차이점
null=True
- 데이터베이스 레벨에서 제어합니다.
- 해당 필드가
NULL
값을 허용할지 여부를 결정합니다. NULL
은 데이터베이스에 정보가 없는 것을 의미합니다.null=True
로 설정하면 해당 필드는NULL
혹은 값을 가질 수 있습니다.
blank=True
- 유효성 검사와 관련됩니다.
- 사용자 입력에서 해당 필드가 비어 있을 수 있는지 여부를 결정합니다.
blank=True
로 설정하면 사용자가 해당 필드를 비워 둘 수 있습니다.- 빈 문자열('')로 저장됩니다.
예시:
class MyModel(models.Model):
name = models.CharField(max_length=255, blank=True, null=True)
age = models.IntegerField(blank=True, null=True)
name
필드는blank=True
와null=True
모두 설정되어 있습니다.- 사용자는
name
필드를 비워 둘 수 있으며, 이 경우 데이터베이스에는 빈 문자열('')이 저장됩니다.
결론:
null=True
는 데이터베이스에NULL
값을 저장할 수 있는지 여부를 결정합니다.- 두 옵션을 함께 사용하면 데이터베이스에 빈 문자열('') 또는
NULL
을 저장할 수 있습니다.
주의:
null=True
와blank=True
를 함께 사용할 때는 주의해야 합니다.- 예를 들어,
primary_key
필드에 두 옵션을 모두 설정하면 데이터베이스 오류가 발생할 수 있습니다. - 모델을 설계할 때 각 필드에
null=True
와blank=True
가 필요한지 신중하게 고려해야 합니다.
추가 자료
예제 코드: null=True
와 blank=True
사용
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=255, blank=True, null=True)
age = models.IntegerField(blank=True, null=True)
phone_number = models.CharField(max_length=20, blank=True, null=True)
# ...
# 모델 사용
my_model = MyModel()
# name 필드에 값 할당
my_model.name = "김철수"
my_model.save()
# age 필드에 값 할당 (선택 사항)
my_model.age = 30
my_model.save()
# phone_number 필드는 비워둠 (선택 사항)
my_model.save()
# 데이터베이스에서 모델 인스턴스 가져오기
retrieved_model = MyModel.objects.get(pk=my_model.pk)
# name 필드 값 출력
print(retrieved_model.name) # "김철수" 출력
# age 필드 값 출력
print(retrieved_model.age) # 30 출력
# phone_number 필드 값 출력 (없을 수 있음)
if retrieved_model.phone_number:
print(retrieved_model.phone_number)
else:
print("전화번호가 없습니다.")
설명:
MyModel
모델은 네 개의 필드를 가지고 있습니다:name
,age
,phone_number
, ...name
필드는CharField
이며,max_length=255
로 설정되어 있습니다. 또한blank=True
와null=True
옵션을 모두 설정합니다.blank=True
는 사용자가 이 필드를 비워 둘 수 있음을 의미합니다.null=True
는 데이터베이스에 빈 문자열('') 또는NULL
값을 저장할 수 있음을 의미합니다.
age
필드는IntegerField
이며,blank=True
와null=True
옵션을 모두 설정합니다.- 코드 예제에서는
MyModel
인스턴스를 만들고,name
필드에 값을 할당하고,age
필드에 값을 선택적으로 할당하고,phone_number
필드는 비워 둡니다. - 모델 인스턴스를 저장하고, 데이터베이스에서 다시 가져온 다음, 각 필드의 값을 출력합니다.
- 이 예제는 기본적인 사용법을 보여주는 데 그 목적이며, 실제 프로젝트에서는 상황에 맞게 모델을 수정해야 합니다.
primary_key
필드에null=True
를 설정하지 않도록 주의하십시오.
추가 정보
Django에서 null=True
및 blank=True
의 대체 방법
기본값 설정:
- 모델 필드에 기본값을 설정하면 사용자가 값을 입력하지 않아도 기본값이 자동으로 저장됩니다.
- 기본값으로
None
을 사용하면 해당 필드가 NULL로 저장됩니다. - 기본값으로 빈 문자열('')을 사용하면 해당 필드가 빈 문자열('')로 저장됩니다.
class MyModel(models.Model):
name = models.CharField(max_length=255, default="")
age = models.IntegerField(null=True, default=0)
phone_number = models.CharField(max_length=20, blank=True, null=True)
default= 생략:
null=True
를 사용하고default=
을 생략하면 해당 필드의 기본값이None
으로 설정됩니다.- 이 경우 사용자가 값을 입력하지 않으면 데이터베이스에
NULL
이 저장됩니다.
class MyModel(models.Model):
name = models.CharField(max_length=255, blank=True, null=True)
age = models.IntegerField(blank=True, null=True)
phone_number = models.CharField(max_length=20, blank=True, null=True)
커스텀 유효성 검사:
clean()
메서드를 사용하여 커스텀 유효성 검사를 작성할 수 있습니다.- 이 메서드에서 필드 값을 검사하고 필요한 경우 예외를 발생시킬 수 있습니다.
from django.core.exceptions import ValidationError
class MyModel(models.Model):
name = models.CharField(max_length=255, blank=True, null=True)
age = models.IntegerField(blank=True, null=True)
phone_number = models.CharField(max_length=20, blank=True, null=True)
def clean(self):
# name 필드가 비어 있으면 ValidationError 발생
if not self.name:
raise ValidationError("이름을 입력하세요")
# age 필드가 음수이면 ValidationError 발생
if self.age and self.age < 0:
raise ValidationError("나이는 음수일 수 없습니다")
django-model-utils 라이브러리 사용:
django-model-utils
라이브러리는AutoCreatedField
,AutoSluggedField
등 다양한 유용한 필드를 제공합니다.- 이러한 필드를 사용하면 코드를 간결하게 만들 수 있으며, 기본값 설정 및 유효성 검사와 같은 작업을 자동화할 수 있습니다.
from django_model_utils.fields import AutoCreatedField, AutoSluggedField
class MyModel(models.Model):
name = models.CharField(max_length=255, blank=True, null=True)
age = models.IntegerField(blank=True, null=True)
phone_number = models.CharField(max_length=20, blank=True, null=True)
created_at = AutoCreatedField(editable=False, default=datetime.now)
slug = AutoSluggedField(populate_from=['name'], unique=True)
- 위에 제시된 방법은 각각 장단점이 있습니다.
- 상황에 맞게 적절한 방법을 선택해야 합니다.
추가 자료
- `django-model-utils
python django django-models