Django로 웹 애플리케이션을 개발하다 보면 모델 필드를 정의할 때 null=True와 blank=True 옵션을 자주 마주치게 된다. 이 두 옵션은 비슷해 보이지만 실제로는 완전히 다른 목적을 가지고 있다.
두 속성의 차이점과 올바른 사용법에 대해 자세히 알아본다.
null=True와 blank=True의 핵심 차이
1. null=True
- 작동 레벨: 데이터베이스 레벨
- 의미: 해당 필드가 데이터베이스에서 NULL 값을 가질 수 있음
- 영향: 데이터베이스 스키마에 직접적인 영향을 줌 (NULL 허용 컬럼으로 생성)
- Python 표현: None 값이 해당 필드에 할당될 수 있음
2. blank=True
- 작동 레벨: Django 폼 검증 레벨
- 의미: 폼에서 해당 필드를 비워둘 수 있음 (필수 입력 항목이 아님)
- 영향: 데이터베이스 스키마에 직접적인 영향을 주지 않음
- 사용처: 관리자 페이지, ModelForm 등에서 필수 입력 항목 여부 결정
필드 타입별 권장 사용법
문자열 필드 (CharField, TextField)
문자열 필드는 Django에서 조금 특별하게 취급된다:
class Article(models.Model):
title = models.CharField(max_length=100) # 필수 필드
subtitle = models.CharField(max_length=100, blank=True) # 선택적 필드
이 경우:
- subtitle은 폼에서 비워둘 수 있음 (blank=True)
- 사용자가 값을 입력하지 않으면 빈 문자열('') 이 데이터베이스에 저장됨
- null=True를 설정하지 않았으므로 데이터베이스에서는 NULL 값을 허용하지 않음
권장사항: 문자열 필드에는 보통 null=True를 사용하지 않는다. 빈 값을 나타내는 방법이 두 가지(NULL과 빈 문자열)가 되면 데이터 일관성에 혼란을 줄 수 있기 때문이다.
비문자열 필드 (IntegerField, DateField, BooleanField 등)
class Event(models.Model):
name = models.CharField(max_length=100)
attendees = models.IntegerField(null=True, blank=True) # 선택적 숫자 필드
event_date = models.DateField(null=True, blank=True) # 선택적 날짜 필드
이 경우:
- attendees와 event_date는 폼에서 비워둘 수 있음 (blank=True)
- 값이 제공되지 않으면 데이터베이스에 NULL이 저장됨 (null=True)
- Python 코드에서 이 필드들은 None 값을 가질 수 있음
권장사항: 숫자, 날짜, 불리언 등의 비문자열 필드에서 선택적 값을 허용하려면 null=True와 blank=True 둘 다 설정하는 것이 좋다.
실제 동작 예시
문자열 필드 (blank=True만 설정한 경우)
class Product(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(blank=True) # null=True 없음
폼에서 description을 비워두고 제출하면:
- 데이터베이스에 빈 문자열('')이 저장됨
- product.description의 값은 '' (빈 문자열)
날짜 필드 (null=True, blank=True 둘 다 설정한 경우)
class Order(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
order_date = models.DateField(auto_now_add=True)
shipped_date = models.DateField(null=True, blank=True)
shipped_date를 지정하지 않고 주문을 생성하면:
- 데이터베이스에 NULL이 저장됨
- order.shipped_date의 값은 None
주의사항
- 일관성 유지하기: 문자열 필드에 null=True와 blank=True를 모두 설정하면 빈 값을 None과 빈 문자열('') 두 가지로 표현할 수 있게 되어 혼란을 줄 수 있다.
- 폼 검증: blank=True는 Django 폼 검증에만 영향을 주므로, 직접 모델 인스턴스를 생성하는 경우에는 영향이 없다.
- 기본값 고려하기: 선택적 필드지만 기본값이 있어야 하는 경우 default 매개변수를 사용할 것:
status = models.CharField(max_length=20, default='pending', blank=True)
priority = models.IntegerField(default=0, blank=True)
요약
Django 모델 필드에서 null=True와 blank=True의 차이점을 정리하면:
- null=True: 데이터베이스 레벨에서 NULL 값을 허용 (Python에서 None 값 허용)
- blank=True: 폼 검증 레벨에서 빈 값을 허용 (필수 입력 항목이 아님)
일반적인 권장사항:
- 문자열 필드: blank=True만 사용 (빈 값은 빈 문자열로 저장)
- 비문자열 필드: 선택적인 경우 null=True, blank=True 둘 다 사용
이러한 차이점을 이해하고 적절히 사용하면 Django 모델을 더 효과적으로 설계할 수 있다.
'Django' 카테고리의 다른 글
[Django] select_related와 prefetch_related 비교 (0) | 2025.02.21 |
---|---|
[Django] Django Debug Toolbar의 윈도우 환경 MIME type 오동작 해결 (0) | 2025.02.20 |
[Django] CreateView (0) | 2025.02.04 |
[Django] PostgreSQL 연동하기 (0) | 2025.02.04 |
[Django] CBV의 동작 원리와 주요 메서드 분석 (1) | 2025.01.26 |