阅读Django文档:
get_user_model()
您应该引用该用户,而不是直接引用User 使用django.contrib.auth.get_user_model()的模型。这种方法会 返回当前活动的用户模型 - 自定义用户模型(如果有) 指定,或用户否则。
为用户定义外键或多对多关系时 model,您应该使用AUTH_USER_MODEL指定自定义模型 设置。
我对上面的文字感到困惑。我应该这样做:
author = models.ForeignKey(settings.AUTH_USER_MODEL)
或者这......
author = models.ForeignKey(get_user_model())
两者似乎都有效。
答案 0 :(得分:57)
使用settings.AUTH_USER_MODEL
会延迟检索实际的模型类,直到加载所有应用程序。 get_user_model
将在第一次导入应用时尝试检索模型类。
get_user_model
无法保证User
模型已加载到应用缓存中。它可能适用于您的特定设置,但它是一个不容错过的场景。如果您更改某些设置(例如INSTALLED_APPS
的顺序),则可能会破坏导入,您将不得不花费额外的时间进行调试。
settings.AUTH_USER_MODEL
将传递一个字符串作为外键模型,如果在导入此外键时模型类的检索失败,则检索将被延迟,直到所有模型类都加载到缓存中。
答案 1 :(得分:34)
从Django 1.11开始,你可以在两种情况下使用get_user_model()
!所以如果你不想进一步打扰它,那就去吧。
“在这两种情况下”意味着:如果您需要用户模型来访问其属性,以及您想要定义ForeignKey / ManyToMany关系。
来自更改日志:
现在可以在导入时调用get_user_model(),即使在定义模型的模块中也是如此。
https://docs.djangoproject.com/en/1.11/releases/1.11/#django-contrib-auth
所以......还有理由使用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!
...
)
答案 2 :(得分:0)
自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
)
答案 3 :(得分:0)
settings.AUTH_USER_MODEL返回一个字符串(用户模型的位置),例如'user_accounts.User'
get_user_model()返回ACTUAL模型类,而不是字符串。
因此,在需要用户模型的情况下,请使用get_user_model()。如果需要它的位置(module.model作为字符串),请使用settings.AUTH_USER_MODEL。
答案 4 :(得分:-8)
如果未设置AUTH_USER_MODEL,则回退到默认用户模型的方法:
from django.conf import settings
from django.contrib.auth.models import User
USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', User)