为什么我必须以这种方式引用用户模型

时间:2014-11-03 09:21:44

标签: django

我正在研究一个Django项目,我正在尝试做这样的事情,以确保无论用户模型设置如何,我的模型都能正常工作。

from django.contrib.auth import get_user_model

class Item(models.Model):
    title = models.CharField(max_length=100, )
    description = models.TextField()
    seller = models.ForeignKey(get_user_model())

然而,当我这样做时,导致错误告诉我无法访问用户模型,所以我不得不将其更改为

from django.conf import settings

class Item(models.Model):
    title = models.CharField(max_length=100, )
    description = models.TextField()
    seller = models.ForeignKey(settings.AUTH_USER_MODEL)

这很好但我以为我过去使用第一种方法做了这个。唯一不同的是,我正在使用自定义用户模型。他们似乎都对我做同样的事情所以为什么我必须使用第二种方法? get_user_model()不能与默认用户一起使用吗?

2 个答案:

答案 0 :(得分:1)

这是django中get_user_model()的源代码:

def get_user_model():
    """
    Returns the User model that is active in this project.
    """
    from django.db.models import get_model

    try:
        app_label, model_name = settings.AUTH_USER_MODEL.split('.')
    except ValueError:
        raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
    user_model = get_model(app_label, model_name)
    if user_model is None:
        raise ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL)
    return user_model

正如您所看到的,它会像您一样从设置中提取AUTH_USER_MODEL变量,但会提取app_label和用户类本身。如果它不起作用,您应该在完成此调用时看到终端中的两个错误之一。

答案 1 :(得分:1)

我认为你的答案在于Django source。这取决于你的设置会发生什么。 Older versions可能会有所不同。