오늘도 개발

모델 필드 추가 시 default 값 설정 본문

웹 프로그래밍/Django

모델 필드 추가 시 default 값 설정

Sueeeeeee 2023. 2. 18. 18:36

모델에 새로운 필드를 추가할 때 default 값을 지정한 후 마이그레이션하면,

기존에 있던 데이터의 새 필드에도 알아서 default 값을 채워준다.

 

예)

1. 기존 모델

class User(models.Model):
   accept_notification = models.BooleanField()

User.objects.all()
# <User: User object (1)>
2. 필드 추가
class User(models.Model):
   accept_notification = models.BooleanField()
   accept_email_notification = models.BooleanField(default=False, null=True)
3. 마이그레이션
python manage.py makemigrations
python manage.py migrate​

4. 기존 데이터의 새 필드 값 확인
User.objects.get(id=1).is_accept_email_notification 
# False

 

유의할 점

장고가 DB에 마이그레이션 할 때 DB 테이블에 락이 걸린다.

데이터 개수가 10만개 이상인 큰 테이블을 위의 방식으로 작업한다면( = migration으로 자동으로 default 값 채워주기),

락이 걸리는 시간이 길어지므로 다운타임이 길어지는 문제가 발생한다. 

 

큰 테이블에 디폴트 값이 있어야 하는 필드를 추가할 때는 아래의 방식을 사용하는 것이 더 낫다. 

 

1. 필드 추가 : default 없이 null=True 옵션만 적용

class User(models.Model):
   accept_notification = models.BooleanField()
   accept_email_notification = models.BooleanField(null=true)

2. 마이그레이션

python manage.py makemigrations
python manage.py migrate​

3. 쉘이나 주피터 노트북으로 디폴트 값 삽입

기존에 있던 User 오브젝트의 accept_email_notification 필드에 디폴트 값 False를 쉘을 이용하여 수동으로 채워준다.

 

4. 추가된 필드에 디폴트 값 추가

class User(models.Model):
   accept_notification = models.BooleanField()
   accept_email_notification = models.BooleanField(null=true, default=False)

5. 마이그레이션

python manage.py makemigrations
python manage.py migrate​