Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django自定义用户模型子类(由Zinia提供)_Django_Zinnia - Fatal编程技术网

Django自定义用户模型子类(由Zinia提供)

Django自定义用户模型子类(由Zinia提供),django,zinnia,Django,Zinnia,我已经迁移到Django自定义用户模型(CustomUser),该模型中有几个其他模型具有外键和M2M关系。CustomUser也是Zinia作者模型(author)的子类——Zinia是一款优秀的第三方博客应用程序 我的问题是,当我通过关系(例如OtherModel.CustomUser)访问CustomUser时,它返回CustomUser的实例,但在我的视图中,当我访问request.User时,它是Author的实例。由于Author和CustomUser的属性是相同的,这通常没有多大区

我已经迁移到Django自定义用户模型(CustomUser),该模型中有几个其他模型具有外键和M2M关系。CustomUser也是Zinia作者模型(author)的子类——Zinia是一款优秀的第三方博客应用程序

我的问题是,当我通过关系(例如OtherModel.CustomUser)访问CustomUser时,它返回CustomUser的实例,但在我的视图中,当我访问request.User时,它是Author的实例。由于Author和CustomUser的属性是相同的,这通常没有多大区别,但如果我想测试视图中用户对象的等效性,我必须使用user request.user.id而不是request.user,我本能地不喜欢处理模型的模糊性

也许我会更好地克服它,让事情保持原样,因为在我的视图中进行一些小的代码更改之后,一切都会正常工作。不过,在一个完美的世界里,我会一直使用相同的用户模型,但不确定如何取得最佳进展。有什么想法吗

设置.py

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()