Django使用get_user_model vs settings.AUTH_USER_MODEL

Pro*_*eus 74 python django

阅读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 将字符串作为外键模型传递,如果在导入此外键时模型类的检索失败,则检索将被延迟,直到所有模型类都加载到缓存中.

  • 具体来说,在函数(视图,模型/序列化器/表单方法)中,使用`get_user_model()`,对于类属性使用`AUTH_USER_MODEL`? (7认同)
  • 具体来说,您可以使用models.ForeignKey(get_user_model())遇到循环导入问题 (5认同)
  • [文档的这一部分](https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#referencing-the-user-model) 说“一般来说,你应该用`AUTH_USER_MODEL` 设置在导入时执行的代码中。`get_user_model()` 仅在 Django 导入所有模型后才有效。 (2认同)

Ilj*_*lja 47

自Django 1.11以来的新功能.

从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)

  • 感谢您指出此建议,不知何故我在写回复时忽略了它,但现在我找到了。我试图将其整合到答案中(仍然偏向于`get_user_model`,尤其是对于对区别感到困惑的读者) (2认同)

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)