Django
는 백엔드에서 꽤 중요한 부분을 차지하고 있는 권한과 인증에 대해 구현이 되어있습니다.(킹왕짱 장고) 이때 User Model
이 사용자들의 데이터를 저장합니다.
물론 이 User Model
을 사용해도 좋지만 서비스를 개발할 땐 기본적으로 Django에서 제공해주는 모델보다 더 다양한 기능과 정보들을 필요로 할 때가 많기 때문에 서비스를 개발 할 때 User Model
을 그대로 사용하는 경우는 거의 없다고 합니다.
아래처럼
settings.py
에 자동으로 적용되어 있다.INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.sessions', ... ]
테이블 추가, 변경 없이 단순히 상속만 하는 방식
정렬순서나 필요한 메소드만 추가하기 위해 사용
기존의 User Model
에 추가적인 사용자 정보를 저장할 필요가 없을 때 사용하는 가장 간단한 방법
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
user_pk = models.IntegerField(blank=True)
nickname = models.CharField(max_length=200, blank=True)
phone = models.CharField(max_length=200, blank=True)
...
모델(테이블)을 추가하여 기존 User Model
과 일대일로 연결시켜서 사용자에 대한 정보를 저장
Django
의 인증 시스템을 그대로 활용하고 로그인, 권한 부여 등과 상관이 없는 사용자 데이터를 저장하고자 할 때 사용하는 간단한 방법
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
user_pk = models.IntegerField(blank=True)
nickname = models.CharField(max_length=200, blank=True)
phone = models.CharField(max_length=200, blank=True)
...
AbstractUser Model
을 상속한 User Model
을 새로 정의하여 사용 (settings.py 수정 필요)
이 기법의 사용 여부는 프로젝트 시작 전에 하는 것이 좋음
기존의 User Model
을 그대로 사용하므로 기본 로그인 인증 처리 부분은 Django
의 것을 이용하면서 몇몇 사용자 정의 필드를 추가할 때 유리함
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
class User(AbstractBaseUser, PermissionsMixin):
objects = UserManager()
email = models.EmailField(verbose_name = "email id", max_length = 64, unique = True)
username = models.CharField(max_length=30)
USERNAME_FIELD = 'email'
date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
...
AbstractBaseUser Model
을 상속한 User Model
을 새로 정의하여 사용 (settings.py 수정 필요)
이 기법의 사용 여부는 프로젝트 시작 전에 하는 것이 좋음
로그인 아이디로 이메일 주소를 사용하도록 하거나 Django
로그인 절차가 아닌 인증 절차를 직접 구현하고자 할 때 사용 (가장 자유도가 높음)
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
bio = models.TextField(max_length=500, blank=True)
location = models.CharField(max_length=30, blank=True)
birth_date = models.DateField(null=True, blank=True)
...