Django 1.5:访问models.py中的自定义用户模型字段

时间:2013-07-04 11:57:22

标签: django django-models django-users django-1.5

我正在研究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会引发错误:

  

NotperlyConfigured(“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',
)

8 个答案:

答案 0 :(得分:10)

我认为很容易。我有很多关于递归包含的问题等等...... 好吧,当你添加一个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()。总是在方法或函数中,永远不要直接在模型模块体中。

答案 1 :(得分:9)

我刚才遇到了同样的问题,这是我的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=...)
        ...

答案 2 :(得分:3)

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

答案 3 :(得分:1)

我认为SomeApp的这个导入会进行循环导入。这就是为什么在docs中有一个声明可以使用调用设置属性执行类似ForeignKey的操作。

至于我,当我使用django-filer app时遇到过这个问题。 github上有一个commit来防止使用get_user_model()进行导入。您可以使用那里的代码作为示例来解决问题。

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

答案 4 :(得分:1)

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

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

真正的解决方案是确保您只在方法中使用get_user_model(),以便在导入时不会执行。

答案 5 :(得分:0)

你必须设置,

  

AUTH_USER_MODEL =“yourapp.CustomUser”

在settings.py中

。然后get_user_model()将起作用。有一个干净的documentation available

答案 6 :(得分: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 

答案 7 :(得分:0)

你在南方跑0.8.3吗?

确保您至少运行South 0.8.4

GitHub issue 南方发布Notes