- Django는 기본적인 인증 시스템과 여러가지 필드가 포함된 User Model을 제공, 대부분의 개발 환경에서 기본 User Model을 Custom User Model로 대체함
- 개발자들이 작성하는 일부 프로젝트에서는 django에서 제공하는 built-in User model의 기본 인증 요구사항이 적절하지 않을 수 있음
- 예를 들어, 내 서비스에서 회원가입시 username 대신 email을 식별 값으로 사용하는 것이 더 적합한 사이트인 경우, Django의 User Model은 기본적으로 username를 식별 값으로 사용하기 때문에 적합하지 않음
- Django는 현재 프로젝트에서 사용할 User Model을 결정하는
AUTH_USER_MODEL
설정 값으로 Default User Model을 재정의(override)할 수 있도록 함
기본 User Model을 Custom User Model로 대체하는 방법에 대해 알아보자!
AUTH_USER_MODEL
- 프로젝트에서 User를 나타낼 때 사용하는 모델
- 프로젝트가 진행되는 동안 (모델을 만들고 마이그레이션 한 후) 변경할 수 없음
- 프로젝트 시작 시 설정하기 위한 것이며, 참조하는 모델은 첫 번째 마이그레이션에서 사용할 수 있어야 함
- 즉, 첫번째 마이그레이션 전에 확정 지어야 함
- 다음과 같은 기본 값을 가지고 있음
AUTH_USER_MODEL = 'auth.User'
Substituting a Custom User model
공식 문서 : Substituting a custom User model
User 모델 상속 관계
AbstractUser
- 관리자 권한과 함께 완전한 기능을 가지고 있는 User model을 구현하는 추상 기본 클래스
- Abstract base classes (추상 기본 클래스)
- 몇 가지 공통 정보를 여러 다른 모델에 넣을 때 사용하는 클래스
- 데이터베이스 테이블을 만드는데 사용되지 않으며, 대신 다른 모델의 기본 클래스로 사용되는 경우 해당 필드가 하위 클래스의 필드에 추가 됨
대체하기
- AbstractUser를 상속받는 커스텀 User 클래스 생성
- 기존 User 클래스도 AbstractUser를 상속받기 때문에 커스텀 User 클래스도 완전히 같은 모습을 가지게 됨
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
- Django 프로젝트에서 User를 나타나는데 사용하는 모델을 방금 생성한 커스텀 User 모델로 지정
AUTH_USER_MODEL = 'accounts.User'
- admin.py에 커스텀 User 모델을 등록
- 기본 User 모델이 아니기 때문에 등록하지 않으면 admin site에 출력되지 않음
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(User, UserAdmin)
데이터베이스 초기화
- AUTH_USER_MODEL 변경은 모델 관계에 영향을 미치기 때문에 어려운 작업 필요하므로 중간 변경은 권장하지 않음 (프로젝트 처음에 진행하기!!!)
- 프로젝트 중간에 AUTH_USER_MODEL 설정을 했을 경우 데이터베이스 초기화 후 마이그레이션
- migrations 파일 삭제
- migrations 폴더 및
__init__.py
는 삭제하지 않음
- 번호가 붙은 파일,
__pycache__
폴더만 삭제
- db.sqlite3 삭제
- migrations 진행
custom User로 변경된 테이블 확인
- 이제
auth_user
테이블이 아니라 account_user
테이블을 사용하게 됨
반드시 User 모델을 대체해야 할까?
- Django는 새 프로젝트를 시작하는 경우 비록 기본 User 모델이 충분하더라도 커스텀 User 모델을 설정하는 것을 강력하게 권장
- 커스텀 User 모델은 기본 User 모델과 동일하게 작동하면서도 필요한 경우 나중에 맞춤 설정할 수 있기 때문
- 단, User 모델 대체 작업은 프로젝트의 모든 migrations 혹은 첫 migrate를 실행하기 전에 이 작업을 마쳐야 함