我已迁移到Django自定义用户模型(CustomUser),其中几个其他模型具有外键和M2M关系。 CustomUser也是Zinnia的作者模型(作者)的子类 - Zinnia是一个出色的第三方博客应用程序。
我的问题是,当我通过例如OtherModel.customuser之类的关系访问CustomUser时,它会返回CustomUser的一个实例,但在我访问request.User的视图中,它是Author的一个实例。由于Author和CustomUser的属性是相同的,这一般没有太大的区别,但如果我想在我的视图中测试用户对象的等价性,我必须用户request.user.id而不是request.user,我本能地穿上'我喜欢模仿我处理的模型。
可能我会更好地克服它并保留原样,因为在我的视图中发生一些小的代码更改之后一切正常。然而,在一个完美的世界中,我将始终指向相同的用户模型,但我不确定如何最好地进步。有什么想法吗?
settings.py
AUTH_USER_MODEL = 'profiles.CustomUser'
models.py(在个人资料应用中)
class CustomUser(AbstractUser):
visits = models.PositiveIntegerField(
_('visits'),
default=0,
blank=True
)
def __unicode__(self):
return self.username
class OtherModel(models.Model):
author = models.ForeignKey(CustomUser)
我知道documentation中的建议是与settings.AUTH_USER_MODEL建立关系,而不是直接与自定义用户模型建立关系。我打算改变这一点,但是想要在再次启动迁移的痛苦之前了解我在做什么
author.py(在百日草应用程序中)
from django.contrib.auth import get_user_model
@python_2_unicode_compatible
class Author(get_user_model()):
"""
Proxy model around :class:`django.contrib.auth.models.get_user_model`.
"""
objects = get_user_model()._default_manager
published = EntryRelatedPublishedManager()
在控制台中,get_user_model()返回profiles.models.CustomUser类
答案 0 :(得分:0)
我想我得到了你的问题。
默认情况下,Django不会向下转换模型实例。例如,请参考以下示例:
from django.db import models
class Parent(models.Model):
name = models.CharField()
class Child(Parent):
pass
Parent(name="parent").save()
Child(name="child").save()
Parent.objects.all() # will return Parent instances
Child.objects.all() # will return Child instances
在您的情况下,您可以使用Zinnia处理Author
个实例,使用CustomUser
实例处理项目的其余部分。所以基本上你可以向下转换每个CustomUser
实例。您可以使用现有的django应用程序来实现这一点,例如django-polymorphic(在我看来,这是使用具体继承时必须具备的)。但是,如果您的所有用户都不是作者,那么您就会搞砸
您还可以妥协并实施手动上传,如下所示:
from django.contrib.auth import get_user_model
class CustomUser(AbstractUser):
# your logic...
def as_custom_user(self):
return super(get_user_model(), self)
用法:
assert request.user.as_custom_user() == article.author.as_custom_user()