언어/PYTHON

[Django] Custom User 적용

HmHjj 2022. 12. 2. 15:35
728x90
반응형

Django 프로젝트에 User 적용 

Django 프로젝트에 User 적용하는 방법을 정리하겠습니다.  

환경 구성 정보

ubuntu 20.04 LTS

 

Django 프로젝트에 User 구성 방법

  1. Proxy  User model
  2. AbstractUser
  3. AbstractBaseUser
  4. User Model One To One 

Proxy User

제공 된 User 의 Class를 그대로 Proxy Model 로 동일한 Table , column 구조를 연결해서 사용하는 방식

ParentUser.objects.all() 로 기본적인 User 조회가 가능해 진다. 

class ParentManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(user_type=UserType.PARENT)

    def create(self, **kwargs):
        kwargs.update({'user_type': UserType.PARENT})
        return super().create(**kwargs)

class CustomUser(CustomUser):
    objects = ParentManger()
    class Meta:
        proxy = True

 

AbstractUser

제공 된 User model 에서 사용하는 field와 권한은 그대로 사용하며, 추가로 넣고 싶은 필드를 넣을수 있는 방법.

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

class User(AbstractUser):
    phone = models.CharField(max_length=20, blank=True, null=True)
    createdDate = models.DateTimeField(auto_now_add=True)
    updatedDate = models.DateTimeField(auto_now=True)

 

AbstractBaseUser

AbstractUser에서 중요한 필드만  password, last_login, is_active  제공 되고, 나머지는 직접 추가해야하는 방법.

User에 대한 식별자를 email 같은 다른 방식으로 로그인하게 할수 있는 방법이나 설정 해줘야하는 부분이 더 많다. 

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

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=timezone.now)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email

 

User Model  OneToOne

User 모델을 OneToOneField로 연결하여 사용하는 방법.

간단하고 추가 필드 설정하기에도 좋다. 

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

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    location = models.CharField(max_length=30, blank=True)
    createDate = models.DateTimeField(auto_now_add=True)

 

 

728x90
반응형