根据用户组/权限返回QuerySet

问题描述

我正在尝试找出基于QuerySet权限限制User的“最佳实践”是什么。

例如,仪表板上有一张发票表。名为User的{​​{1}}的{​​{1}}可以看到所有发票,但是具有组Group的{​​{1}}只能看到他们自己的发票。这意味着仅包含Admin的发票。

我的想法是创建两个权限Userbroker

现在,当我使用user = ...调用can_see_all_invoices时,我将检查权限并返回过滤后的can_see_own_invoices

还是我应该在前端过滤QuerySet,如果Django Rest Framework索要所有发票,我会引发PermissionError吗?

正在使用这些方法中的哪些方法?或者有其他方法

解决方法

IMO,这将是一种干净的方法

class MyInvoiceAPI:
    def get_queryset(self):
        qs = Invoice.objects.all()
        if self.request.user.has_perm('can_see_all_invoices'):
            return qs
        return qs.filter(user=self.request.user)

注释

  • 您不需要两个权限,只需一个can_see_all_invoices
  • 在这种情况下,我不会引发任何权限被拒绝的错误,因为它是一个List API,而对象的评估是一个昂贵的过程