[Django] Custom User Model

문지은·2023년 4월 26일
0

Django 기초

목록 보기
10/14
post-thumbnail
  • 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를 나타낼 때 사용하는 모델
  • 프로젝트가 진행되는 동안 (모델을 만들고 마이그레이션 한 후) 변경할 수 없음
  • 프로젝트 시작 시 설정하기 위한 것이며, 참조하는 모델은 첫 번째 마이그레이션에서 사용할 수 있어야 함
    • 즉, 첫번째 마이그레이션 전에 확정 지어야 함
  • 다음과 같은 기본 값을 가지고 있음
# settings.py

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 클래스도 완전히 같은 모습을 가지게 됨
# accounts/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass
  • Django 프로젝트에서 User를 나타나는데 사용하는 모델을 방금 생성한 커스텀 User 모델로 지정
# settings.py

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 설정을 했을 경우 데이터베이스 초기화 후 마이그레이션
  1. migrations 파일 삭제
    • migrations 폴더 및 __init__.py 는 삭제하지 않음
    • 번호가 붙은 파일, __pycache__ 폴더만 삭제
  2. db.sqlite3 삭제
  3. migrations 진행
    • makemigrations
    • migrate

custom User로 변경된 테이블 확인

  • 이제 auth_user 테이블이 아니라 account_user 테이블을 사용하게 됨

반드시 User 모델을 대체해야 할까?

  • Django는 새 프로젝트를 시작하는 경우 비록 기본 User 모델이 충분하더라도 커스텀 User 모델을 설정하는 것을 강력하게 권장
  • 커스텀 User 모델은 기본 User 모델과 동일하게 작동하면서도 필요한 경우 나중에 맞춤 설정할 수 있기 때문
    • 단, User 모델 대체 작업은 프로젝트의 모든 migrations 혹은 첫 migrate를 실행하기 전에 이 작업을 마쳐야 함
profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글