User / UserManager

 

  • manager 클래스를 통해 DB와 데이터를 주고 받는다.
  • User와 함께 BaseUserManger를 만들어 주어야 한다.
  • 장고가 만들어준 필수사항이 존재한다.

 

(settings.py)

#users 앱의 User 모델
AUTH_USER_MODEL = "user.Users"

 

 

(app - models.py)

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


# User를 생성할 때 사용하는 헬퍼 클래스
class UserManager(BaseUserManager):
    # 사용자를 생성
    def create_user(self, email, name, gender,  age, bio, password=None):
        if not email:
            raise ValueError("이메일을 입력하세요")
        user = self.model(
            email=self.normalize_email(email),
            name=name,
            gender=gender,
            age=age,
            bio=bio,
        )
        # 장고에서 제공하는 password 설정 함수
        user.set_password(password)
        user.save(using=self._db)
        return user

    # 관리자 생성
    def create_superuser(self, email, name, gender, age, bio, password=None):
        user = self.create_user(
            email,
            name=name,
            gender=gender,
            age=age,
            bio=bio,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user


class Users(AbstractBaseUser):
    GENDER_CHOICE = {
        ('male', 'Male'),
        ('female', 'Female'),
    }

    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=30)
    gender = models.CharField(max_length=10, choices=GENDER_CHOICE, blank=True)
    age = models.PositiveIntegerField(default=0, blank=True)
    bio = models.TextField(blank=True)

    # User 모델의 필수 field
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    # 헬퍼 클래스 사용
    objects = UserManager()

    # 쉽게 말해 login ID
    USERNAME_FIELD = "email"

    # 이거 없으면 cratesuperuser 만들때 에러남
    REQUIRED_FIELDS = ["name", "gender", "age", "bio"]

    def __str__(self):
        return self.email
    
    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        return self.is_admin

 

 

'Python > Django' 카테고리의 다른 글

[DRF] 07. 유저 API  (0) 2023.04.26
[DRF] 06.5 admin 커스텀  (0) 2023.04.25
[DRF] 05. 기본 JWT 토큰  (0) 2023.04.24
[DRF] 04.5 Fetch API, CORS 에러  (0) 2023.04.24
[DRF] 04. 클래스 뷰(CBV)  (0) 2023.04.24

+ Recent posts