일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Virtual Box 7.0.6
- 8기
- 웹/모바일
- 네이버
- 후기
- 부스트캠프
- 운영체제론
- id # tr # 환경변수
- Ubuntu 20.04
- 네이버 부스트 코스
- 보기 편하라고 만든
- 백준 #baekjoon # 2563
- Today
- Total
Miner
User모델 커스터마이즈하기 본문
커스텀 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' 카테고리의 다른 글
Vue.js - Django 연동 웹 프로그래밍(3) (0) | 2023.11.29 |
---|---|
Vue.js - Django 연동 웹 프로그래밍(2) (0) | 2023.11.29 |
Vue.js - Django 연동 웹 프로그래밍(1) (1) | 2023.11.27 |
장고 Instagram clone #4 (0) | 2023.10.15 |
장고 Instagram clone #3 앱 생성, 간단한 결과띄우기 (0) | 2023.10.15 |