티스토리 뷰

반응형

get_user_model()을 많이 쓰는데, get_user_model에 대한 정리는 산발적으로 되어있다. 따라서 내가 여러 개념 들을 정리하고 축약해서 정리해보겠다. 당연히 User에 대해 간단히 우선적으로 알아보자. 상세산 설명은 여기를 눌러보자.

 

 

User

우리는 웹을 만들 때 회원관리를 위해 user를 DB에 넣어야 할 것이다. 이 때 기본적으로 User를 장고가 제공을 한다. 우선 장고 내부의 User가 어떻게 구현되어 있는지를 확인하자.

 

 

User가 가진 기능은 거의 없다. 대부분의 속성은 User가 가지고 있는게 아니라 User가 상속받는 AbstractUser가 다 가지고 있다. 즉, User는 기능이 없는 깡통 수준이고, 장고 내부에 세팅된 값이라 변경도 불가능하다. 그렇기 때문에 User 재정의가 필요한 것이다. 

 

User 내부에 class Meta 내부에 있는 코드를 보자.

  • swappable= 'AUTH_USER_MODEL' 의 뜻은 AUTH_USER_MODEL이라는 속성에 의해서 무엇인가가 바뀔 수 있다는 것을 의미한다. 이후에 User 설정하는 부분에서 AUTH_USER_MODEL를 사용할 수 있게 해주는 코드라고 생각하자.

 

 

그렇다면, User를 어떻게 재정의하나?

 

프로젝트 만들고, app 생성 후에 migrate 전 단계라고 가정을 하고 시작하겠다. (나는 account라는 app을 만들었다.)

 

account/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.

class User(AbstractUser):
    pass

 

이러한 방식으로 정의를 하면 된다. 그리고 settings.py에 아래와 같이 추가해 주면 된다.

 

AUTH_USER_MODEL = 'accounts.User'

 

AUTH_USER_MODEL은 accounts의 app의 models.py에서 내가 설정한 User를 사용하겠다고 설정하는 부분이다. 좀 더 개념적 이해를 위해 get_user_model()를 설명해 보겠다.

 

 

사용법

기본 USER

사용하는 방법은 get_user_model()을 활용해서 사용한다. 기본적으로 불러오는 방법은 아래와 같다.

 

from django.contrib.auth import get_user_model

 

get_user_model을 통해 User를 잡을 수 있는지를 확인해 보자. custom user를 정의하기 전에 get_user_model을 실행시켜보고, 그 이후에 내가 정의한 User를 get_user_model이 가리키는지를 확인해 보자.

 

프로젝트 생성 후에 아래와 같이  shell_plus를 통해 확인해 보고자 한다.

 

# 설치
> pip install django-extensions

# settings.py에 app추가
    'django_extensions',
    
# shell_plus 실행
> python manage.py shell_plus

 

# shell_plus 실행
>>> get_user_model()
<class 'django.contrib.auth.models.User'>

 

get_user_model()은 django.contrib.auth.models.User를 가리킨다. 즉, 처음에 설명한 깡통 User를 가리킨다.

 

 

 

 

 

사용자 정의한 USER

그렇다면, 위에서 정의한 것들을 정의해 본 후에 get_user_model()이 가리키는 것을 확인해 보자.

 

account/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.

class User(AbstractUser):
    pass

 

이러한 방식으로 정의를 하면 된다. 그리고 settings.py에 아래와 같이 추가해 주면 된다.

 

AUTH_USER_MODEL = 'accounts.User'

 

그 후에 다시 shell_plus를 진행해준다.

 

>>> get_user_model()
<class 'accounts.models.User'>

 

내가 정의한 User로 잘 잡히는 것을 확인할 수 있다.

 

 

 

정리하면 get_user_model()은 기본적으로 내부 깡통 User를 잡는다. 그리고 custom으로 User를 따로 만들어도 get_user_model()은 새롭게 만든 User를 잡는다. 

 

 

 

 

AUTH_USER_MODEL 

AUTH_USER_MODEL 관련해서 추가 설명을 넣어보겠다. 기본적으로 디폴트 값은 아래와 같다.

 

AUTH_USER_MODEL = 'auth.User'

 

위에서 우리는 아래와 같이 settings.py에 추가 설정을 해줘서 디폴트 값을 바꾸는 것이다. 그리고 이것의 사용은 get_user_model()을 활용해서 한다.

 

AUTH_USER_MODEL = 'accounts.User'

 

  • 'accounts.User' : accounts의 의미는 내가 만든 app의 이름을 의미하고, User는 models.py에서 정의한 class의 이름을 넣어준 거다. 

 

 

get_user_model()과 settings.AUTH_USER_MODEL 차이점

기본적으로 같은 것을 가리키는 것 같다. 그렇다면 언제 무엇을 써야 하는가? 우선 shell_plus를 사용해서 확인을 해보자.

 

>>> get_user_model()
<class 'accounts.models.User'>
>>> settings.AUTH_USER_MODEL
'accounts.User'

 

  • get_user_model() : 클래스이다.
  • settings.AUTH_USER_MODEL : 문자열이다.

 

get_user_model()은 아래와 같이 문자열이 아닌 클래스가 들어가야 하는 경우에는 사용해 주면 된다.

 

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserChangeForm, UserCreationForm

# 그대로 활용하지 못하는 경우는 항상 상속받아서 custom한다.
class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = get_user_model()
        fields = ['username', 'first_name', 'last_name', 'email']

 

 

아래와 같이 클래스 내부에 들어가는 경우는 문자열을 쓰는 것이 맞다.

 

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    followers = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='followings'
        )

 

 

 

 

마지막으로 정리해보면, 장고 내부의 User로 할 수 있는 게 제약이 많다. 따라서 내가 User를 models.py에 만들어준다. 그리고 settings.py에서 AUTH_USER_MODEL 설정을 해준다. 그 후에 get_user_model()을 이용해서 클래스로 사용해준다. 

 

추가 내용은 아래에서 참고하자.

 

2020.08.13 - [Web/Django] - [Django]사용자인증관리_login, 쿠키와 세션, 캐쉬

2021.01.04 - [Web/Django] - [Django]사용자인증관리_User모델, 비밀번호 암호화

2021.01.05 - [Web/Django] - [Django] 장고 회원가입 구현하기 기초

2021.01.06 - [Web/Django] - [Django]장고 회원 프로필 구현하기

2021.01.07 - [Web/Django] - [Django]사용자인증관리_Update, 유저정보수정(UserChangeForm)

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함