将 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 模型的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError: 'QuerySet' 对象没有属性 'add'