[django | model] Build a Backend REST API - 8

Hyeseong·2021년 2월 26일
0

write models.py in core app🎊

core앱 안의 models.py에서
장고가 제공하는 User 클래스를 customizing해서 작성해볼게요.

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, \
                                        PermissionsMixin  # 3가지 클래스는 장고 유저 모델을 커스터마이징 할때 필요해요.

class UserManager(BaseUserManager):
        
    def create_user(self, email, password=None, **extra_fields):
        '''Creates and saves a new user '''
        user = self.model(email=self.normalize_email(email), **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

UserManager class를 만들건데요. 함수를 작동을 돕거나 superuser생성을 만들어 주는 기능을해요.
우선 클래스 첫 정의시 BaseUserManager를 넣어서 기본적인 기능들을 모두 상속받아요. 그래서 몇가지 기능들을 오버라이딩해서 username대신 email 필드를 메인으로 사용할 수 있도록 할게요.

create_user메서드를 정의할게요. 두번째 인자로 email을 넣고, 네 번째로 **extra_fields를 넣어 추가로 필드 작성을 대비하거나 활용을 용이하게 하기 위해 정의한 부분이에요. 필수로 작성해야하는 건 아니지만 더 유연하게 코드를 작성할 수 있어서 권장되는 부분이에요.

user = self.model(email=email, **extra_fields)

위 코드에서 메서드에서 정의된 키워드 인자가 self.model에 바로 활용된게 보이네요.

user.set_password()는 Django의 AbstractBaseUser에서 파생되어 나온 부분인데요.

공식문서에서는 아래와 같이 정의하네요.

Sets the user’s password to the given raw string, taking care of the password hashing. Doesn’t save the User object.

When the raw_password is None, the password will be set to an unusable password, as if set_unusable_password() were used.

또한 user.save(using=self._db)에서 안의 인자 부분은 multiple database를 사용할 때 특히 이점이 있어요. 하지만 여기서는 사용하지 않으니 일단 참고용도로 정의만 할게요.

매니저 클래스 정의는 이렇게 했고, User클래스를 만들어 볼게요.

class User(AbstractBaseUser, PermissionsMixin):
    '''Custom user model that supports using email instead of username'''
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()
    
    USERNAME_FIELD = 'email'
    

처음 클래스에 AbstractBaseUser, PermissionsMixin 모델을 상속받도록 할게요. 여기서 일반 User모델을 작성하는것과 크게 다른점은 username 대신 email 필드를 메인으로 잡아서 사용하기 위함이조.

objects = UserManager()를 정의해서 작성했던 UserManager 클래스를 사용할게요.

그리고 USERNAME_FIELD에 'email'값을 넣도록 할게요.

settings.py

우리가 커스터마이징한 User모델을 장고에게 알려줘야해요.

settings.py

...
...

AUTH_USER_MODEL = 'core.User'

그리고 마이그레이션 할게요.

./manage.py makemigrations core && .manage.py migrate

그러면 Build a Backend REST API - 7 에서 실패했던 test를 해보면 이제 OK 싸인이 떨어져요.

./manage.py test

처음으로 TDD(Test Driven Development) 방식을 진행해봤어요. Core앱의 한 부분을 한거라 갈길은 멀고도 멉니다. 화이팅🎈

profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글