阅读Django文档:
get_user_model()
您应该使用django.contrib.auth.get_user_model()来引用用户模型,而不是直接引用User.此方法将返回当前活动的用户模型 - 如果指定了自定义用户模型,则返回自定义用户模型,否则返回User.
为User模型定义外键或多对多关系时,应使用AUTH_USER_MODEL设置指定自定义模型.
我对上面的文字感到困惑.我应该这样做:
author = models.ForeignKey(settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)
或这个...
author = models.ForeignKey(get_user_model())
Run Code Online (Sandbox Code Playgroud)
两者似乎都有效.
knb*_*nbk 69
使用settings.AUTH_USER_MODEL将延迟检索实际模型类,直到加载所有应用程序.get_user_model将在第一次导入应用程序时尝试检索模型类.
get_user_model无法保证User模型已加载到应用缓存中.它可能适用于您的特定设置,但它是一个不容错过的场景.如果你改变一些设置(例如顺序INSTALLED_APPS),它可能会破坏导入,你将不得不花费额外的时间进行调试.
settings.AUTH_USER_MODEL 将字符串作为外键模型传递,如果在导入此外键时模型类的检索失败,则检索将被延迟,直到所有模型类都加载到缓存中.
Ilj*_*lja 47
从Django 1.11开始,你可以 - 而且应该 - get_user_model()在两种情况下使用!它比不必要的更短,更干燥settings.AUTH_USER_MODEL.
来自更改日志:
现在可以在导入时调用get_user_model(),即使在定义模型的模块中也是如此.
https://docs.djangoproject.com/en/1.11/releases/1.11/#django-contrib-auth
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!
...
)
Run Code Online (Sandbox Code Playgroud)
Imp*_*ror 13
settings.AUTH_USER_MODEL返回一个字符串(用户模型的位置),例如user_accounts.User。
get_user_model()返回实际模型类,而不是字符串。
因此,如果您需要 User 模型,请使用get_user_model(). 如果您需要它的位置(module.model作为字符串),请使用settings.AUTH_USER_MODEL.
小智 11
从 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
)
Run Code Online (Sandbox Code Playgroud)