在一个属性中搜索值列表时覆盖Django过滤器

lyr7nygr  于 2023-04-07  发布在  Go
关注(0)|答案(1)|浏览(103)

我有一个简单的GroupViewSet,它允许通过id和parent过滤Group对象。一切都按预期工作。
我想通过允许多父过滤器来扩展功能。类似于/API/groups/?parent=1&parent=2。
问题是返回的列表只被最后提供的父值过滤。所以在我的例子中,返回的查询集将被parent=2过滤。我如何在保留其他功能的同时覆盖值列表的过滤器?

class GroupViewSet(ModelViewSet):
    queryset = models.Group.objects.all()
    serializer_class = serializers.GroupSerializer
    filter_backends = (DjangoFilterBackend)
    filterset_fields = ('id', 'parent')

    def get_queryset(self):
        parent_ids = self.request.query_params.getlist('parent')
        if len(parent_ids) > 1:
            return self.queryset.filter(parent__in=parent_ids)
        return self.queryset
8dtrkrch

8dtrkrch1#

我认为最简单的方法是声明FilterSet而不是使用快捷键。
由于FilterSet在后台使用Form,因此应该正确处理参数列表

class GroupFilter(django_filters.FilterSet):
    class Meta:
        model = models.Group
        fields = {
            'id': ['exact'],
            'parent': ['in'],
        }

class GroupViewSet(ModelViewSet):
    queryset = models.Group.objects.all()
    serializer_class = serializers.GroupSerializer
    filter_backends = (DjangoFilterBackend,)
    filterset_class = GroupFilter

相关问题