Django自定义用户模型子类(由Zinia提供)
我已经迁移到Django自定义用户模型(CustomUser),该模型中有几个其他模型具有外键和M2M关系。CustomUser也是Zinia作者模型(author)的子类——Zinia是一款优秀的第三方博客应用程序 我的问题是,当我通过关系(例如OtherModel.CustomUser)访问CustomUser时,它返回CustomUser的实例,但在我的视图中,当我访问request.User时,它是Author的实例。由于Author和CustomUser的属性是相同的,这通常没有多大区别,但如果我想测试视图中用户对象的等效性,我必须使用user request.user.id而不是request.user,我本能地不喜欢处理模型的模糊性 也许我会更好地克服它,让事情保持原样,因为在我的视图中进行一些小的代码更改之后,一切都会正常工作。不过,在一个完美的世界里,我会一直使用相同的用户模型,但不确定如何取得最佳进展。有什么想法吗 设置.pyDjango自定义用户模型子类(由Zinia提供),django,zinnia,Django,Zinnia,我已经迁移到Django自定义用户模型(CustomUser),该模型中有几个其他模型具有外键和M2M关系。CustomUser也是Zinia作者模型(author)的子类——Zinia是一款优秀的第三方博客应用程序 我的问题是,当我通过关系(例如OtherModel.CustomUser)访问CustomUser时,它返回CustomUser的实例,但在我的视图中,当我访问request.User时,它是Author的实例。由于Author和CustomUser的属性是相同的,这通常没有多大区
AUTH_USER_MODEL = 'profiles.CustomUser'
models.py(在profiles应用程序中)
我知道中的建议是与settings.AUTH_USER_模型建立关系,而不是直接与自定义用户模型建立关系。我计划改变这一点,但在再次开始迁移之前,我想了解我在做什么
author.py(在百日咳应用程序中)
在控制台中,get_user_model()返回profiles.models.CustomUser类我想我明白了您的问题 默认情况下,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应用程序实现这一点,例如(在我看来,这是处理具体继承时必须具备的)。然而,如果你的用户都不是作者,你就完蛋了
您也可以妥协,并按如下方式实现手动向上转换:
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()
我也有同样的问题。你找到解决办法了吗?
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()