Miner

User모델 커스터마이즈하기 본문

Django

User모델 커스터마이즈하기

MineTime76 2023. 11. 29. 16:02

커스텀 User 모델을 작성하는 세 가지 방법

  •  표준 User 모델과 1대 1 관계를 가지는 모델을 만드는 방법
  • AbstractUser을 상속받는 모델을 만드는 방법
  • AbstractBaseUser을 상속받는 모델을 만드는 방법

표준 User 모델과 1대 1관계를 가지는 모델을 만드는 방법

예를 들어 다음과 같이 표준 User 모델과 1대1 관계를 가진 모델을 만들어 유저 정보를 추가하고 싶은 정보를 쓴다.

class UserAddInfo(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    department = models.CharField()
    image = models.ImageField()

 

이렇게 표준 User 모델을 그대로 활용하며 새로운 정보를 User에 추가할 수 있다. 그러나 이 방법에서는 기존의 칼럼(first_name이나 last_name등) 을 반드시 이용해야하며, email로 로그인할 수 있도록 변경할 수 없다.

 또한, 테이블가 여러개 나뉘므로 Web 어플리케이션의 포퍼먼스가 나빠지는 단점이 있다. 이러한 이유들도 표준 User모델과 1대1 관계를 가진 모델을 생성하는 것은 추천하지 않는다.

 

AbstaractUser을 상속한 모델을 만드는 방법

 AbstaractUser은 표준 User 모델이 상속하여 이용하는 방법이다. AbstractUser모델은 django.contrib.auth.models에 다음과 같이 정의되어 있다.

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    username_validator = UnicodeUsernameValidator()
    username = models.CharField(_('username'), max_length=150, unique=True,…)
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    email = models.EmailField(_('email address'), blank=True)
    is_staff = models.BooleanField(_('staff status'), default=False,…)
    is_active = models.BooleanField(_('active'), default=True,…)
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

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

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        abstract = True

 

 AbstaractUser은 AbstaractUser과 PermissionMixin을 상속받고 있다. 위의 AbstaractUser모델을 상속받는 커스텀 User 모델을 생성하기 위한 방법은  "표준 User모델과 1대1의 관계를 가진 모델을 만들기"와 커다란 차이점이 없다.

 테이블이 여러 개로 나뉘어 퍼포먼스가 나빠지는 등의 불편함은 없지만, 칼럼(속성) 추가만 가능하므로 모델의 유연성이 낮다. 표준 User 모델에 칼럼만을 추가하고 싶은 경우에는 이 방법을 이용하면 편리하다.

 

AbstractBaseUser을 상속받는 모델을 만드는 방법

AbstractBaseUser은 django.contrib.auth.base_user에 다음과 같이 정의되어 있다.

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

    is_active = True

    REQUIRED_FIELDS = []

    _password = None

    class Meta:
        abstract = True

 

AbstractBaseUser은 django.db.models.Model 상속 받고 있다. AbstractBaseUser에는 인증 기능이 포함되어 있으므로 독자적인 필드를 설정하는 것이 가능하다.

 즉, 인증 이외의 부분은 어떤 것도 구현되어 있지않은 클래스로, first_name이나 last_name이라는 필요없는 필드를 User 모델에 쓰지 않아도된다. AbstractBaseUser을 상속받는 User 모델을 만드는 것은 귀찮지만, 커스터마이즈의 유연성이 방법 중이 가장 높다.

 

출처 : https://engineer-mole.tistory.com/301

 

[Django] User모델 커스터마이즈하기 (커스텀 User 모델)

※일본의 한 블로그 글을 번역한 포스트입니다. 의역 및 직역, 오역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다. Django에서는 표준 User 모델이 정의되어 있다. 그러나 대부분은

engineer-mole.tistory.com

 

* 시간이 날 때 해보기