get_user_model vs settings.AUTH_USER_MODEL을 사용하는 Django


98

Django 문서 읽기 :

get_user_model ()

User를 직접 참조하는 대신 django.contrib.auth.get_user_model ()을 사용하여 사용자 모델을 참조해야합니다. 이 메서드는 현재 활성화 된 사용자 모델 (지정된 경우 사용자 지정 사용자 모델, 그렇지 않은 경우 사용자)을 반환합니다.

사용자 모델에 대한 외래 키 또는 다 대다 관계를 정의 할 때 AUTH_USER_MODEL 설정을 사용하여 사용자 지정 모델을 지정해야합니다.

위의 텍스트와 혼동됩니다. 이렇게해야합니까?

author = models.ForeignKey(settings.AUTH_USER_MODEL)

아니면 이거...

author = models.ForeignKey(get_user_model())

둘 다 작동하는 것 같습니다.

답변:


87

를 사용 settings.AUTH_USER_MODEL하면 모든 앱이로드 될 때까지 실제 모델 클래스 검색이 지연됩니다. get_user_model앱을 처음으로 가져올 때 모델 클래스 검색을 시도합니다.

get_user_modelUser모델이 이미 앱 캐시에로드 되었음을 보장 할 수 없습니다 . 특정 설정에서 작동 할 수 있지만 뺑소니 시나리오입니다. 일부 설정 (예 :의 순서 INSTALLED_APPS) 을 변경 하면 가져 오기가 매우 잘 중단 될 수 있으며 디버깅에 추가 시간을 소비해야합니다.

settings.AUTH_USER_MODEL 외래 키 모델로 문자열을 전달하고이 외래 키를 가져올 때 모델 클래스 검색에 실패하면 모든 모델 클래스가 캐시에로드 될 때까지 검색이 지연됩니다.


7
구체적으로는, 당신이 models.ForeignKey와 원형 수입 문제로 실행할 수 있습니다 (get_user_model ())
크리스 클라크

2
문서의이 섹션 은 "일반적으로 말하면, AUTH_USER_MODEL가져 오기시 실행되는 코드 의 설정으로 사용자 모델을 참조해야합니다 . get_user_model()Django가 모든 모델을 가져온 후에 만 작동합니다."
Hamish Downer 2015 년

7
따라서 구체적으로 함수 (뷰, 모델 / 시리얼 라이저 / 양식 메서드)에서 get_user_model(), 클래스 속성에 사용 AUTH_USER_MODEL?
Nick T

53

Django 1.11 이후의 새로운 기능입니다.

Django 1.11부터 get_user_model()두 경우 모두 사용할 수 있습니다 ! 그러니 더 이상 신경 쓰고 싶지 않다면 그냥 받아들이세요.

"두 경우 모두"는 해당 속성에 액세스하기 위해 사용자 모델이 필요한지 여부와 ForeignKey / ManyToMany 관계를 정의하려는 경우를 의미합니다.

에서 변경 로그 :

get_user_model ()은 이제 모델을 정의하는 모듈에서도 가져올 때 호출 할 수 있습니다.

그래서 ... 아직 사용할 이유가 settings.AUTH_USER_MODEL있나요? 글쎄, 문서는 여전히 settings.AUTH_USER_MODEL관계를 정의하기 위해 (문자열)을 권장 하지만 명시적인 이유를 제공하지 않습니다. 성능에 도움이 될 수 있지만 그다지 중요하지 않은 것 같습니다.

코드 예 :

from django.db import models
from django.contrib.auth import get_user_model
...
    ...
    user = models.ForeignKey(
        get_user_model(),
        null=True, # explicitly set null, since it's required in django 2.x. - otherwise migrations will be incompatible later!
        ...
    )

get_user_model()가져올 때 호출 할 수 있음 을 지적 해 주셔서 감사합니다 . 그러나 Django는 여전히 사용자가 AUTH_USER_MODEL을
kevins

2
이 추천을 지적 해주셔서 감사합니다. 답장을 쓸 때 왠지 간과했지만 지금은 찾았습니다. 나는 이것을 대답에 통합하려고 노력했습니다 ( get_user_model특히 구별에 대해 혼란스러운 독자들을 위해 여전히 선호 )
Ilja

7

Django 1.11부터 get_user_model()실제로 다음을 사용합니다 settings.AUTH_USER_MODEL.

def get_user_model():
    """
    Return the User model that is active in this project.
    """
    try:
        return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
    except ValueError:
        raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
    except LookupError:
        raise ImproperlyConfigured(
            "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
        )

0

settings.AUTH_USER_MODEL은 문자열 (사용자 모델의 위치)을 반환합니다 (예 : 'user_accounts.User').

get_user_model ()은 문자열이 아닌 ACTUAL 모델 클래스를 반환합니다.

따라서 사용자 모델이 필요한 경우 get_user_model ()을 사용하십시오. 위치 (문자열로 module.model)가 필요한 경우 settings.AUTH_USER_MODEL을 사용하십시오.


-11

AUTH_USER_MODEL이 설정되지 않은 경우 기본 사용자 모델로 대체하는 방법 :

from django.conf import settings
from django.contrib.auth.models import User

USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', User)

7
AUTH_USER_MODEL이미 기본값이 있으므로 항상 설정됩니다.
knbk

4
settings.AUTH_USER_MODEL 또한 문자열과 대체가 User모델이다
매트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.