将 queryset as_manager 添加到 AbstractUser 模型

Posted

技术标签:

【中文标题】将 queryset as_manager 添加到 AbstractUser 模型【英文标题】:Add queryset as_manager to the AbstractUser model 【发布时间】:2020-04-18 19:38:56 【问题描述】:

我有一个简单的 User 模型,它只是用一些额外的字段扩展了 AbstractUser 类。我尝试添加“objects = UserQuerySet.as_manager() 但在我尝试创建超级用户时给了我一个错误“get_by_natural_key() is not defined”。似乎它正在覆盖常规用户管理器,所以我失去了它附带。我尝试将对象字段重命名为其他内容,这样我就不会覆盖默认字段,但它仍然是相同的错误。有没有办法简单地添加查询集而不创建全新的管理器类,扩展 BaseUserManager,添加所有从头开始使用默认方法,并向其中添加我的自定义查询集?我只想保留常规的 UserManager 并添加查询集。

class UserQuerySet(QuerySet):
    def more_ten(self):
        return self.filter(points__gt=10)

class User(AbstractUser):
    points = IntegerField(default=0)
    tester = UserQuerySet.as_manager()
    #objects = UserQuerySet.as_manager()

【问题讨论】:

您能分享您的自定义用户模型和自定义查询集代码吗? 【参考方案1】:

根据docs,您的自定义用户管理器应该继承自BaseUserManager

class UserQuerySet(QuerySet):

    def more_ten(self):
        return self.filter(points__gt=10)


from django.contrib.auth.models import UserManager as OldUserManager


class UserManager(OldUserManager):

    def get_queryset(self):
        return UserQuerySet(model=self.model, using=self._db, hints=self._hints)


class User(AbstractUser):

    objects = UserManager()

【讨论】:

我知道。问题是是否无论如何都只使用 queryset_as_manager() 而不是必须显式创建管理器,或者没有办法做到这一点。我尝试让查询集类从 BaseUserManager 继承,但这不起作用。 @eliezerperlowitz 问题在于BaseUserManager 添加的方法不是QuerySet 方法,因此不可能有一个可以返回具有这些方法的经理的查询集 我。试图查看是否实现了快捷方式;(。无论如何尝试了您的代码,但它显示“AttributeError:'UserManager' 对象没有属性'create_superuser'”。您知道为什么它没有从 BaseUserManager 继承 createsuperuser 方法吗? 您可能能够摆脱从docs.djangoproject.com/en/3.0/ref/contrib/auth/… 继承,因为您添加的唯一附加字段具有默认值 谢谢哥们。只是恼人的是,他们没有使用默认管理器和使用 queryset.as_manager 的快捷方式。现在将为查询集和管理器编写方法。但感谢您的帮助。

以上是关于将 queryset as_manager 添加到 AbstractUser 模型的主要内容,如果未能解决你的问题,请参考以下文章

Django Querysets - 添加字符串文字注释

AttributeError: 'QuerySet' 对象没有属性 'add'

QuerySet中添加Extra进行SQL查询

list(zip(*querySet))使用

如何将值从 get_queryset() 传递到 get_context_data()

Django - 如何将 QuerySet 转换为 Q 对象?