Django/DRF

user/models.py - user모델 만들기

Jong_seoung 2023. 3. 21. 15:51
반응형

전체 코드 내용

from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import PermissionsMixin
from django.core.mail import send_mail
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _


class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError('이메일을 설정해야 합니다')
        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=None, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        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_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=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):
    email = models.EmailField(_('email address'), unique=True, blank=False)
    name = models.CharField(_('name'), max_length=30, blank=False)
    is_staff = models.BooleanField(_('staff status'), default=False, help_text=_('Designates whether the user can log into this admin site.'),)
    is_active = models.BooleanField(_('active'), default=False, help_text=_('Designates whether this user should be treated as active. ' 'Unselect this instead of deleting accounts.'),)
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    USERNAME_FIELD = 'email'

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        swappable = 'AUTH_USER_MODEL'

    def email_user(self, subject, message, from_email=None, **kwargs):
        """
        Sends an email to this User.
        """
        send_mail(subject, message, from_email, [self.email], **kwargs)

 

 

코드 해석

 

 

create_user

새로운 사용자를 생성하는 User모델 매니저의 메서드입니다. email, password,**extra_fields 매개변수를 받습니다.

 

extra_fields는 위에서도 이야기했듯 선택적으로 전달할수 있는 어려 사용자 속성을 포함할 수 있는 딕셔너리입니다.

 

setdefault 함수를 이용하여 is_staff와 is_superuser의 속성을 기본값으로 설정합니다. 각각 관리자 권한과 슈퍼유저 권한입니다.

 

마지막으로 _create_user() 메서드를 호출하고 email,password,**extra_fields 의 값들을 전달합니다.

 

 

_create_user

UserManager클래스의 매서드 중 하나로 새로운 객체를 생성하고 저장하는 기능을 합니다.

email과 password는 필수적 인자이며 extra_fields는 선택적으로 전달될 수 있습니다.

 

email이 비어 있는지 확인하고 이메일을 소문자로 정규화합니다. 이메일 주소는 대소문자를 구문 하지 않기 때문에 모두 소문자로 만들어 혼란을 줄이고 일관성을 유지할 수 있습니다.

 

email과 extra_fields를 사용하여 User모델의 새로운 인스턴스를 만듭니다.

set_password를 사용하여 암호화된 비밀번호를 저장하고 save를 통해 데이터 베이스에 저장합니다.

 

 

create_superuser

superuser를 생성하는 Django의 User모델 매니저의 메서드입니다. email, password, **extra_fields를 매개변수로 받습니다.

 

우선적으로 extra_fields 매개변수를 사용해서 관리자권한과 슈퍼유저 권한을 True로 설정합니다. super_user를 생성하는 매서드이기 때문에 당연하 모두 True로 설정해야 합니다.

 

만약 is_staff나 is_superuser가 False일 경우 ValueError가 발생하며 메시지가 출력됩니다.

 

마지막으로 _create_user() 메서드로 email, password,**extra_fields를 전달해 줍니다.

 

 

class User

email, name, is_staff, is_active, date_joinde 등의 필드를 가지고 있고 각각 이메일주소, 이름, 스태프권한, 활성화상태, 가입일자를 나타납니다. 

 

objects속성은 UserManager() 클래스의 인스턴스를 참조하고 있습니다. - 모든 사용자 모델에 필요한 메서드를 구현하는 매니저입니다.

 

USERNAME_FIELD는 사용자를 식별하는 필드입니다. - email로 식별하고 있습니다.

 

Meta 클래스는 모델 클래스의 메타데이터를 지정합니다. 여기서는 모델의 이름과 이름의 복수형을 설정하고 AUTH_USER_MODEL변수를 사용하여 모델을 변경가능한 유저 모델로 지정합니다.

 

email_user은 이메일을 보내는 데 사용됩니다. subject는 제목, message는 내용으로 이메일을 보냅니다. from_email은 보내는사람의 이메일입니다. **kwargs는 이메일을 보내는데 사용되는 추가 매개변수를 전달합니다. 이 메서드는 이메일 송신기능을 간편하게 사용할 수 있도록 제공합니다.

 

 

 

추가 설정 / settings.py

현재 기본 user모델이 장고에서 제공하는 user모델로 설정되어 있기때문에 settings.py에서 아래의 코드를 넣어줘야 마이그레이트 했을때 원하는 db값이 나옵니다.

AUTH_USER_MODEL = '앱이름.모델이름r'

------ 예시 -------

AUTH_USER_MODEL = 'user.User'
반응형