【问题标题】:Django: Override user queryset to filter out admin/staff users from the public?Django:覆盖用户查询集以从公众中过滤掉管理员/员工用户?
【发布时间】:2019-10-04 06:34:14
【问题描述】:

我想过滤用户管理器 self.get_queryset() 方法,使客户端应用程序上的用户在搜索或查看其他帐户时看不到管理员和员工用户。我遇到的问题是,如果我完全覆盖 get_queryset,我将无法使用我的身份验证系统登录。我目前的设置是:

class AccountManager(BaseUserManager):
    def get_public_queryset(self):
        return self.get_queryset().filter(active=True, verified=True, admin=False, staff=False)



如果我在管理器中定义了各种排序方法(因为我可以简单地调用该方法),使用这种设计效果很好,但似乎应该有更好的方法来做到这一点。有什么想法吗?

【问题讨论】:

    标签: python django server django-rest-framework backend


    【解决方案1】:

    我认为您实施的其他方法是一个很好的解决方案,但如果您坚持使用 get_queryset 方法,则可以覆盖该方法并保留基本功能。我会做这样的事情:

    ...
    def get_queryset(self, *a, **kw):
        queryset = super().get_queryset(*a, **kw)
        # filter your queryset here as you wish
        queryset = queryset.filter(active=True, verified=True, admin=False, staff=False)
        return queryset
    ...
    

    正如我从问题文本中发现的那样,您尝试调用 self.get_queryset() 这将是递归调用(不是超类实现调用),这最终会导致超出最大递归深度错误。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-13
      • 2018-02-06
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      相关资源
      最近更新 更多