Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django使用get\u user\u model vs settings.AUTH\u user\u model_Python_Django - Fatal编程技术网

Python Django使用get\u user\u model vs settings.AUTH\u user\u model

Python Django使用get\u user\u model vs settings.AUTH\u user\u model,python,django,Python,Django,阅读Django文档: 获取用户模型() 您应该引用用户,而不是直接引用用户 使用django.contrib.auth.get\u user\u model()建模。这种方法将 返回当前活动用户模型–自定义用户模型(如果有) 已指定,或用户已指定 定义外键或与用户的多对多关系时 模型,您应该使用AUTH\u USER\u模型指定自定义模型 背景 我对上面的课文感到困惑。我是否应该这样做: author = models.ForeignKey(settings.AUTH_USER_MODEL)

阅读Django文档:

获取用户模型()

您应该引用用户,而不是直接引用用户 使用django.contrib.auth.get\u user\u model()建模。这种方法将 返回当前活动用户模型–自定义用户模型(如果有) 已指定,或用户已指定

定义外键或与用户的多对多关系时 模型,您应该使用AUTH\u USER\u模型指定自定义模型 背景

我对上面的课文感到困惑。我是否应该这样做:

author = models.ForeignKey(settings.AUTH_USER_MODEL)
或者这个

author = models.ForeignKey(get_user_model())

两者似乎都起作用。

使用
设置。AUTH\u USER\u MODEL
将延迟实际模型类的检索,直到加载所有应用程序
get\u user\u model
将在第一次导入应用程序时尝试检索模型类

get\u user\u model
无法保证
user
model已加载到应用缓存中。它可能在您的特定设置中起作用,但这是一个碰运气的场景。如果更改某些设置(例如,
已安装的应用程序的顺序
),很可能会中断导入,您将不得不花费额外的时间进行调试


settings.AUTH\u USER\u MODEL
将传递一个字符串作为外键模型,如果在导入此外键时检索模型类失败,则检索将延迟,直到所有模型类加载到缓存中

如果未设置AUTH_user_模型,则返回默认用户模型的方法:

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

USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', User)
自Django 1.11以来新增。 由于Django 1.11,您可以在这两种情况下使用!所以,如果你不想再为此烦恼,就接受它吧

“在这两种情况下”的意思是:如果您需要用户模型来访问其属性,以及如果您想要定义ForeignKey/ManyToMany关系

发件人:

现在可以在导入时调用get_user_model(),即使在定义模型的模块中也是如此

所以。。。是否仍有理由使用
设置。验证用户模型
?当然,文档仍然建议使用
设置.AUTH\u USER\u MODEL
(一个字符串)来定义关系,但没有给出明确的原因。可能对性能有利,但似乎没有多大关系

代码示例:
自Django 1.11以来,
get\u user\u model()
实际上使用了
设置。AUTH\u user\u 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
        )

settings.AUTH\u USER\u MODEL
返回字符串(用户模型的位置),例如
USER\u accounts.USER

get\u user\u model()
返回实际的模型类,而不是字符串


因此,如果需要用户模型,请使用
get\u User\u model()
。如果您需要它的位置(
module.model
作为字符串),请使用
设置。AUTH\u USER\u model

具体来说,您可以在模型中遇到循环导入问题。ForeignKey(get\u USER\u model())说“一般来说,您应该使用导入时执行的代码中的
AUTH\u User\u model
设置来引用用户模型
get\u user\u model()
仅在Django导入所有模型后才起作用。”因此,具体地说,在函数(视图、模型/序列化器/表单方法)中,使用
get\u user\u model()
,对于类属性,使用
AUTH\u USER\u MODEL
AUTH\u USER\u MODEL
已经有一个默认值,因此它将始终被设置。settings.AUTH\u USER\u MODEL也是一个字符串,您的回退
USER
是一个模型感谢您指出
get\u USER\u MODEL()
可以在导入时调用;但是,Django仍然建议用户使用thank you指出此建议来定义外键和多对多关系,不知何故,我在撰写回复时忽略了它,但现在我找到了它。我试图将其集成到回答中(仍然倾向于
get_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
        )