6

我正在开发一个 Django 1.5 项目,并且我有一个自定义用户模型(我们称之为CustomUser)。另一个应用程序 (SomeApp) 需要引用此自定义用户模型。出于 ForeignKey 等的目的,Django 文档说要使用

User = settings.AUTH_USER_MODEL 

但是,SomeApp.models 中的某些函数需要访问以前称为User.objects. 但是 User 现在是一个字符串而不是一个类,所以User.objects失败了。替代方案是

from django.contrib.auth import get_user_model
User = get_user_model()

这适用于其他模块,但是当我在 SomeApp 的 models.py 中使用它时,Django 会引发错误:

ImproperlyConfigured("AUTH_USER_MODEL 引用了尚未安装的模型 '%s'" % settings.AUTH_USER_MODEL)

有任何想法吗?

编辑 1 - 回溯:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "...\django-badger\badger\__init__.py", line 7, in <module>
    from badger.models import Badge, Award, Progress
  File "...\django-badger\badger\models.py", line 26, in <module>
    User = get_user_model()
  File "...\lib\site-packages\django\contrib\auth\__init__.py", line 127, in get_user_model
    raise ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL)
ImproperlyConfigured: AUTH_USER_MODEL refers to model 'MyApp.AuthUser' that has not been installed

编辑 2 - INSTALLED_APPS 设置:

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.admindocs',
'south',
'MyApp',   # this is where my user model is defined
'SomeApp', # I try to use get_user_model() in this app's models.py; doesn't work.
'social_auth',
)
4

8 回答 8

10

我刚才遇到了同样的问题,这是我的 2 美分/解决方案。

如果您想在 models.py 中使用自定义用户模型,您将使用外键settings.AUTH_USER_MODEL和您必须使用的模型方法,get_user_model()但它必须方法内部。由于循环导入,它不会在外面工作。

from django.conf import settings
from django.contrib.auth import get_user_model

class Event(models.Model):

    recipient = models.ForeignKey(settings.AUTH_USER_MODEL)
    ...

    def get_something(self):

        User = get_user_model()
        u = User.objects.get(id=...)
        ...
于 2013-10-15T13:10:49.497 回答
10

容易的,我想。我在递归包含等方面遇到了很多问题......好吧,当你添加 a 时,最简单的事情就是这样ForeignKey写:

user = models.ForeignKey(settings.AUTH_USER_MODEL, null=False, on_delete=models.CASCADE, verbose_name=_(u"User"))

如果您使用get_user_model,请不要像以前那样使用它。打电话

User = get_user_model()

模块顶部的将尝试导入您的User模型,该模型实际上可能尚未“安装”。相反,您有多种选择:

  • 在模块的顶部,写

    User = get_user_model # 那么,你将不得不使用 User() 而不是 User

  • get_user_model()在任何有用的地方。总是在方法或函数中,从不直接在模型模块体中。

于 2013-11-04T01:11:37.913 回答
3

确保您的自定义用户模型不是抽象的。

于 2013-07-28T21:38:15.667 回答
1

我认为来自 SomeApp 的这种导入是循环导入。这就是为什么在文档中有一个声明来执行诸如 ForeignKey 之类的调用设置属性的原因。

至于我,我在使用 django-filer 应用程序时遇到过这个东西。在 github 上有一个提交以防止使用 get_user_model() 进行导入。您可以像示例一样使用那里的代码来解决问题。

这个问题非常棘手,因为当您尝试从 shell 调用 get_user_model() 时 - 它会起作用。

于 2013-08-29T14:49:27.090 回答
1

Django 文档有答案:https ://docs.djangoproject.com/en/dev/topics/auth/customizing/#django.contrib.auth.get_user_model

最相关的部分:一般来说,您应该在导入时执行的代码中使用 AUTH_USER_MODEL 设置来引用用户模型。get_user_model() 仅在 Django 导入所有模型后才有效。

真正的解决方案是确保您只get_user_model()在方法内部使用,这样它就不会在导入时执行。

于 2014-07-04T11:18:01.353 回答
0

你必须设置,

AUTH_USER_MODEL = "yourapp.CustomUser"

在 settings.py 中。然后get_user_model()意志起作用。有一个干净的文档可用

于 2013-07-04T12:17:43.663 回答
0

你在运行 South 0.8.3 吗?

确保您运行 South 至少0.8.4

GitHub issue South 发行说明

于 2014-01-21T21:21:19.013 回答
0

我开始认为可能需要一种解决方法 - SomeApp/models.py 中对以下内容的任何评论:

from django.contrib.auth.models import User as UserModel
try:
    from django.contrib.auth import get_user_model
except ImportError:  #django <= 1.4 doesn't have get_user_model so define our own
    def get_user_model():
        return UserModel
User = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
...
def SomeModel(models.Model):
    user = models.ForeignKey(User)  # using the name of the model
    def some_method(self, email):
        qs = get_user_model().objects.filter(email=email)  # using function call to get model class 
于 2013-07-05T03:33:56.563 回答