장고 시작하기 20. django custom user model 만들기

장고(Django)는 강력한 웹 개발 프레임워크로서 기본적으로 내장된 user 모델을 제공합니다. 그러나 때로는 기본 user 모델이 프로젝트의 요구 사항을 충족시키지 못할 수 있습니다. 이런 경우, django custom user model 을 만들어서 user model 에 유연성을 줄 수 있습니다.

이번 포스트에서는 장고에서 사용자 정의 모델을 만드는 다양한 방법과 이를 효과적으로 구현하는 방법에 대해 알아보겠습니다.

form을 사용하는 경우, serializer를 사용하는 경우 모두 정리해보았으며, 주의해야 되는 부분NOTE 혹은 “주의“로 표기하여 정리하였습니다.

Model 설정

AbstractUser 을 상속 받아서 "django custom user model“을 정의해 줄 수 있습니다.

장고에서 기본적으로 제공하는 User 모델에서 제거해주고 싶은 field는 None으로 정의해 줍니다.

  • 장고 기본 user 모델에서 제공해주는 영어식 이름을 원하지 않는 경우 first_name = None , last_name = None 과 같이 정의해서 해당 필드를 제외 할 수 있습니다.

NOTE : REQUIRED_FIELDS 변수에 추가된 필드를 넣어줘야 추후에 supseruser 생성 시에 해당 데이터도 입력 받습니다.

나머지는 기존 모델 정의법과 동일 합니다.

# your_app/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    name = models.CharField(max_length=150)
    birthday = models.DateField()
    GENDER = [
        ("M", "male"),
        ("F", "female"),
    ]
    gender = models.CharField(choices=GENDER, max_length=1)
    self_introduction = models.TextField(null=True)
    first_name = None
    last_name = None

    REQUIRED_FIELDS = ['name', 'birthday', 'gender']

    def __str__(self):
        return self.name

settings 설정

settings.py에서 AUTH_USER_MODEL = 'your_app.User'와 같이 사용자 정의한 모델을 정의해줘야 합니다.

your_app 부분에는 사용자 모델을 만드는 app 이름을 적습니다.

...

# settings.py
AUTH_USER_MODEL = 'your_app.User'

...

Admin 설정

admin 페이지를 사용하는 경우 Custom user를 사용하기 위해 admin.py 에 아래와 같이 작성합니다

# your_app/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

admin.site.register(User, UserAdmin)

Serializer 설정

API 생성을 위해 시리얼라이져를 사용하는 경우, 2가지 방법으로 custom user 시리얼라이져를 정의 할 수 있습니다.

방법 1. get_user_model 사용

settings.py에 AUTH_USER_MODEL = 'your_app.User' 로 정의해주었기 때문에 get_user_model을 사용하면 Custom User을 가져 올 수 있습니다.

# your_app/serializers.py
from rest_framework import serializers
from django.contrib.auth import get_user_model

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = ['username', 'password', 'email', 'name',
                  'birthday', 'gender', 'self_introduction']
        extra_kwargs = {
            'username': {'required': True},
            'name': {'required': True},
            'birthday': {'required': True},
            'password': {'write_only': True,
                         'required': True,
                         },
            'email': {'required': True},
            'self_introduction': {'required': False},
        }

방법2. 모델 모듈에서 직접 Custom User 모델 가져오기

from .models import User로 직접 custom user 모델을 가져와서 쓸 수 있습니다.

NOTE :

그런데 이 경우 암호가 해쉬화 되지 않는 다는 점에 유의해야 합니다.

def validate_password() 입력해줘야 hash된 비밀번호가 저장됩니다.

# your_app/serializers.py
from rest_framework import serializers
from .models import User
from django.contrib.auth.hashers import make_password


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username', 'password', 'email', 'name',
                  'birthday', 'gender', 'self_introduction']
        extra_kwargs = {
            'username': {'required': True},
            'name': {'required': True},
            'birthday': {'required': True},
            'password': {'write_only': True,
                         'required': True,
                         },
            'email': {'required': True},
            'self_introduction': {'required': False},
        }

    def validate_password(self, value: str) -> str:
        """
        Hash value passed by user.
        :param value: password of a user
        :return: a hashed version of the password
        """
        return make_password(value)

Form 설정

MVT 패턴의 view 작업을 돕기 위한 custom user form은 다음과 같이 사용할 수 있습니다.

시리얼라이져와 마찬가지로 get_user_model()을 사용하거나 from .models import User 형식으로 직접 User model을 가져와서 model 속성을 정의해 줄 수 있는데요.

get_user_model()로 model을 정의하는 것을 권장합니다

# your_app/forms.py
from django import forms
from django.contrib.auth import get_user_model

class CustomUserForm(forms.ModelForm):
    class Meta:
        model = get_user_model()
        fields = ['username', 'email', 'first_name', 'last_name', 'birthday', 'gender']  # 필요한 필드 추가

주의. django custom user model 을 개발 초기에 진행하지 않은 경우

DB를 이미 마이그레이션 해서 사용하다가 UserCustom을 하는 경우, db.sqlite3 파일 및 __init__.py를 제외한 모든 migration 을 삭제 후 다시 migration을 진행 해야 오류 없이 사용자 정의 유저 모델을 사용할 수 있습니다.

마치며

장고에서 개발 중간에 커스텀 유저 모델을 정의한다는 것은 migration 시 엉키는 문제와 함께 여러 사항들을 변경들이 따를 수 있기 때문에 최대한 초기에 정의하는 게 좋다는 것을 깨닫게 되었습니다.

또한 이번 기회에 커스텀 유저 모델 사용 시 알아야 하는 것들을 정리하게 되어 다음에는 손쉽게 해당 과제를 진행 할 수 있을 것 같습니다.

참고하면 좋은 글

Leave a Comment

목차