【问题标题】:Add queryset as_manager to the AbstractUser model将 queryset as_manager 添加到 AbstractUser 模型
【发布时间】: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()

【问题讨论】:

  • 您能分享您的自定义用户模型和自定义查询集代码吗?

标签: django django-rest-framework


【解决方案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 的快捷方式。现在将为查询集和管理器编写方法。但感谢您的帮助。
猜你喜欢
  • 2021-07-24
  • 2021-09-30
  • 2017-04-28
  • 1970-01-01
  • 2017-09-24
  • 2013-01-29
  • 2011-03-24
  • 1970-01-01
  • 2016-12-22
相关资源
最近更新 更多