Django使用get_user_model vs settings.AUTH_USER_MODEL

时间:2014-07-08 10:40:48

标签: python django

阅读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())

两者似乎都有效。

5 个答案:

答案 0 :(得分:57)

使用settings.AUTH_USER_MODEL会延迟检索实际的模型类,直到加载所有应用程序。 get_user_model将在第一次导入应用时尝试检索模型类。

get_user_model无法保证User模型已加载到应用缓存中。它可能适用于您的特定设置,但它是一个不容错过的场景。如果您更改某些设置(例如INSTALLED_APPS的顺序),则可能会破坏导入,您将不得不花费额外的时间进行调试。

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

答案 1 :(得分:34)

自Django 1.11以来的新功能。

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