使用自定义过滤器后端过滤django rest框架查询集

时间:2017-11-06 16:14:01

标签: python django django-rest-framework

我在过滤查询集时遇到问题。这是一个简化的数据模型:

Entry
- id
- broadcast_groups

User
- id
- groups

因此,可以在组中广播(共享)条目。我有一个返回条目对象的GET /entries/端点。

我想过滤查询集以返回满足以下要求的条目:

  • 未在 OR
  • 的任何群组中播放
  • 以用户所属的组广播。

我在摸不着头脑如何实现这一目标。我想也许写一个自定义FilterBackend是个好主意。以下是我到目前为止的情况:

class CanViewPublicOrGroupMemberEntriesFilterBackend(filters.BaseFilterBackend):

    def filter_queryset(self, request, queryset, view):
        user = request.user
        return queryset.filter(broadcast_groups__in=user.groups.all())

然而,这并没有产生我期待的结果。实现此类过滤的filter()语法是什么?或者我可能是从错误的一方接近问题?

1 个答案:

答案 0 :(得分:1)

您正在寻找Q对象https://docs.djangoproject.com/en/1.11/topics/db/queries/#complex-lookups-with-q-objects

class CanViewPublicOrGroupMemberEntriesFilterBackend(filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        user = request.user
        return queryset.filter(
            Q(broadcast_groups__in=user.groups.all()) |
            Q(broadcast_groups__isnull=True)
        )