[Django] migrations.swappable_dependency(settings.AUTH_USER_MODEL) 에 대하여
migration 로그를 읽어보던 중, 다음과 같은 dependency를 발견했다. 장고 도큐먼트에 언급되어 있지 않아서 궁금해졌다.
🚀 django.contrib.auth의 User
django.contrib.auth 에서는 유저를 정의할 수 있는, 인증에 관련된 모델을 제공해준다.
우리는 이 모델(가장 상위 모델은 User인데, 사실상 대부분의 속성은 AbstractUser 가 가지고 있다. 따라서 보통 AbstractUser를 상속하여 사용한다) 을 확장하여 서비스 내에서 customizing한 유저 모델을 생성하고, 이를 settings 변수인 AUTH_USER_MODEL에 지정함으로서 우리가 정의한 유저를 사용할 수 있게 된다.
인증에 관련된 모델이 상속되는 구조를 다이어그램으로 나타낸 것이다.
커스텀한 모델(apps.users.models.User에 해당)이 AbstractUser를 상속하도록 정의하였다
하지만 우리가 지정한 유저 모델을 사용한다고 하여 django.contrib.auth 의 migration이 반영되지 않는 것은 아니다.
기본적으로 auth app의 수행을 위한 모델에 대한 migration이 필요하므로 auth.migrations에 정의되어 있는 Permission, Group 모델의 migration은 적용이 된다. 반면 인증을 위한 auth의 모델인 User는 swappable depencency이므로, auth.migrations 진행시에 무시된다. (custom한 모델을 사용할 것이므로)
GitHub - django/django: The Web framework for perfectionists with deadlines.
The Web framework for perfectionists with deadlines. - GitHub - django/django: The Web framework for perfectionists with deadlines.
github.com
이 dependency 때문에, db 테이블을 생성한 이후에 AUTH_USER_MODEL이 참조하는 custom 유저 모델을 수정하는 것은 그닥 좋은 방법이 아니다. AUTH_USER_MODEL이 참조하는 custom 유저 모델은 반드시, app의 첫 migration 파일에만(0001_initial.py 와 같은) 생성되어야만 한다.
db 테이블을 생성한 이후 수정하려 하는 경우, dependency loop에 의한 CircularDependencyError 같은 문제가 발생할 수 있다. 이 때는 그냥 drop schema 한 뒤에 다시 migration을 수행하는 것이 좋다. (개발중이라면. 운영 중에는... 모르겠다)
Why does initial migration have dependencies?
Without any prior migrations I have added custom User model in core app to enable custom authentication by following the documentation entry Django 2.0 / Customizing authentication in Django Then ...
stackoverflow.com
django.contrib.auth | Django documentation | Django
Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate
docs.djangoproject.com