Django 에러 해결: "non-nullable field 'identifier' 추가 불가" 문제
이런 에러 메시지를 마주할 때가 있다.
It is impossible to add a non-nullable field 'identifier' to customuser without specifying a default. This is because the database needs something to populate existing rows.
이 에러는 새로운 non-nullable 필드를 추가하려고 할 때 발생한다. 이미 데이터가 존재하는 테이블에 새로운 필드를 추가하는데, 이 필드가 값을 반드시 가져야 한다고 Django가 명시적으로 요구하기 때문이다. 기존 데이터가 이 필드에 값을 가지고 있지 않으니까, Django는 "어떻게 해야 하나?" 하고 물어보는 상황이 발생하는 것이다.
이 문제를 해결할 수 있는 방법은 크게 세 가지가 있다. 상황에 맞게 하나를 선택하면 된다.
1. 기본값 지정하기
이게 가장 직관적인 방법이다. 만약 identifier 값이 모든 CustomUser에 대해 동일한 기본값이면, 필드에 default 값을 추가하는 방법이다. 이렇게 하면 기존의 레코드들도 기본값으로 자동 채워지기 때문에 에러가 해결된다.
from django.db import models
class CustomUser(models.Model):
identifier = models.CharField(max_length=50, unique=True, default='default_value')
default='default_value' 부분을 원하는 값으로 바꾸면 된다. 이 방법은 모든 데이터에 동일한 기본값을 적용할 때 유용하다. 마이그레이션을 다시 실행해주면 끝:
python manage.py makemigrations
python manage.py migrate
2. Null 허용하기
만약 identifier 값이 필수가 아니라면? 기존 사용자 데이터 중 일부는 identifier가 없어도 되므로 null=True를 추가하여 null을 허용하는 방법도 있다.
from django.db import models
class CustomUser(models.Model):
identifier = models.CharField(max_length=50, unique=True, null=True, blank=True)
null=True와 blank=True는 identifier 필드가 비어 있어도 상관없음을 의미한다. 이 방법은 필드가 선택적인 경우에 적합하다. 기존 데이터는 아무 값도 없지만, 이후 새로운 사용자 추가 시에는 identifier 값을 넣을 수 있게 된다.
3. 데이터베이스에서 기본값 지정
마지막으로, makemigrations 명령을 실행할 때 기존 데이터베이스에 기본값을 채울 방법을 물어보는 방식이다. --merge 옵션을 사용해서, Django가 기존 데이터에 기본값을 추가할 수 있도록 유도하는 방법이다.
python manage.py makemigrations --merge
이 명령을 실행하면 Django가 기본값을 물어보고, 이를 채울 수 있다. 특정 필드에 어떤 값을 기본값으로 설정할지 입력할 수 있게 된다.
결론
새로운 non-nullable 필드를 추가할 때는 기존 데이터가 존재한다는 점을 항상 염두에 둬야 한다. 이 문제를 해결할 수 있는 방법은 3가지다:
- 기본값 추가: 모든 사용자에게 동일한 기본값을 적용하고 싶다면 default를 설정한다.
- Null 허용: 일부 사용자에게 identifier가 비어 있어도 된다면 null=True와 blank=True로 설정한다.
- 기본값 지정: 마이그레이션 중 기존 데이터베이스에 기본값을 채우도록 한다.
상황에 맞는 방법을 고르고, 마이그레이션을 실행해 주면 끝!