我正在研究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',
)
答案 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)
你必须设置,
在settings.py中AUTH_USER_MODEL =“yourapp.CustomUser”
。然后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)