gpt4 book ai didi

子类化的 Django 自定义用户模型(由 Zinnia)

转载 作者:行者123 更新时间:2023-12-03 17:52:30 25 4
gpt4 key购买 nike

我已迁移到 Django 自定义用户模型 (CustomUser),其中其他几个模型具有外键和 M2M 关系。 CustomUser 也是 Zinnia 的作者模型 (Author) 的子类 - Zinnia 是一个出色的第三方博客应用程序。

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

可能我更好地克服它并保持原样,因为在我的 View 中进行了一些小的代码更改后一切正常。然而,在一个完美的世界中,我会一直指的是同一个 User 模型,但不确定如何最好地进步。有任何想法吗?

设置.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 类

最佳答案

我想我明白你的问题了。

默认情况下,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()

关于子类化的 Django 自定义用户模型(由 Zinnia),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17543268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com