본문으로 바로가기
반응형

Django에는 디폴트로 유저모델이 존재한다.

하지만 해당 유저모델에는 상당히 많은 기본 컬럼이 존재하기에, 커스터마이징이 필요한 경우가 많다.

일반적으로 Custom User Model을 만들려면 AbstractUser 또는 AbstractBaseUser를 상속받아서 만든다.

먼저 아래의 명령어로 프로젝트와 앱을 생성한다.


django-admin startproject project .

django-admin startapp users


그리고 settings.py에 우리가 생성한 users와 rest_framework를 추가해준다.

다음으로 models.py에 아래의 내용을 채워넣는다.

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import PermissionsMixin
from django.db import models


class UserManager(BaseUserManager):
use_in_migrations = True

def _create_user(self, email, password, **extra_fields):
"""
Creates and saves a User with the given email and password.
"""
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_user(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)

def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_admin', True)
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_active', True)

if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')

return self._create_user(email, password, **extra_fields)


class User(AbstractBaseUser, PermissionsMixin):
"""Default : id / password / last_login"""
objects = UserManager()

USER_TYPE_CHOICES = (
('django', 'Django'),
('facebook', 'Facebook'),
('gmail', 'Gmail')
)
user_type = models.CharField(
max_length=20,
choices=USER_TYPE_CHOICES,
default=USER_TYPE_CHOICES[0]
)

email = models.EmailField(max_length=100, null=False)
username = models.CharField(max_length=20, unique=True)
phone = models.CharField(max_length=12)

is_staff = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)

date_joined = models.DateTimeField(auto_now_add=True)

USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']

AbstractBaseUser는 정말 딱 필요한 컬럼만 가지고 있기 때문에 직접 작성해줘야 하는 부분이 상당히 많다.

먼저 아래쪽에 있는 User클래스부터 살펴본다.

위에서 말했던 AbstractBaseUser를 포함하여 PermissionMixin까지 상속받았는데

이러한 퍼미션을 상속받지 않으면 어드민 패널에서 오류가 발생한다.

다음으로 objects = UserManager() 를 통해 사용할 Manager를 명시해줬다.

AbstractBaseUser클래스로 들어가보면,

password = models.CharField(_('password'), max_length=128)
last_login = models.DateTimeField(_('last login'), blank=True, null=True)

is_active = True

이렇게 기본적인 컬럼을 몇개 가지고 있다.

따라서 위 컬럼은 모델쪽에 명시하지 않아도 된다.

is_staff = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)

이렇게 4개의 컬럼은 어드민 패널에서 사용하는 권한 관련 필드이므로 꼭 추가해줘야한다.

USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']

USERNAME_FIELD는 아이디로 사용하는 필드를 지정해주는 것이고

REQUIRED_FIELDS는 꼭 필요한 필드를 명시해주는 곳이다.

다음으로 어드민 패널에 등록해줘야 한다.

admin.py를 연다.

from django.contrib import admin
from . import models

@admin.register(models.User)
class UserAdmin(admin.ModelAdmin):
pass

위 내용을 넣어준다.

다음으로 serializers.py파일을 하나 생성하고 아래의 내용을 넣어준다.

from rest_framework import serializers
from .models import User


class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = (
'user_type',
'email',
'username',
'phone',
'password',
)

views.py를 열고 아래의 내용을 넣는다.

from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import UserSerializer


class UserList(APIView):
def get(self, request):
return Response()

def post(self, request):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response()
else:
return Response()

본 포스팅에서는 유저를 등록시키는 부분만 작성할 것이므로 post쪽만 만들었다.

이제 프로젝트의 urls.py를 열고 아래의 내용을 넣는다.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('users.urls'))
]

우리가 만든 users앱의 urls를 추가해준 모습이다.

다음으로 users앱에 urls.py파일을 추가하고 아래의 내용을 넣는다.

from django.urls import path
from .views import UserList

urlpatterns = [
path('v1/users/', UserList.as_view()),
]

우리가 위에서 생성한 뷰를 라우팅해주는 부분이다.

마지막으로 아래의 명령어를 실행한다.


python3 manage.py makemigrations

python3 manage.py migrate

python3 manage.py runserver

반응형