DRF:在一个请求中过滤多个字段

时间:2021-07-15 22:18:39

标签: python django-rest-framework

我必须实现一组过滤器(见图)。我的代码适用于 1 个过滤器,例如

http://127.0.0.1:8000/api/constructions?field=developer&value=1 -- 按 id =1 的开发者过滤

我想在一个请求中按多个过滤器进行过滤。 我可以使用这样的东西

  1. http://127.0.0.1:8000/api/constructions?field=field1_field2&value=value1_value2
  2. 拆分 field1_field2 --> [field1, field2] 等等(不完美)

有没有更好的方法来解决我的问题?

enter image description here

views.py

class ConstructionView(viewsets.ModelViewSet):
    serializer_class = ConstructionSerializer
    queryset = Construction.objects.all()
    pagination_class = BasePagination

    def list(self, request):
        field = request.GET.get('field', None)
        value = request.GET.get('value', None)
        if field is not None and value is not None:
            queryset = Construction.objects.filter(**{field:value})
        else:
            queryset = Construction.objects.all()
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = ConstructionSerializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        else:
            serializer = ConstructionSerializer(queryset, many=True)
            return Response(serializer.data, status=status.HTTP_200_OK)

2 个答案:

答案 0 :(得分:1)

如果您的 query_params 中有一个列表,则可以使用该方法。您可以检查 query_params 的值是列表还是字符串并将其应用于过滤器。 <fieldname>__in 适用于列表。

custom_filter = {'field__in': request.query_params.get('field'), 'value__in': request.query_params.get('value')}
queryset = Construction.objects.filter(**custom_filter )

也许 djangorestframework-queryfields 可以帮助您完成一些常见的工作。

答案 1 :(得分:1)

如果你想通过他们的 ID 获取多个对象,你可以尝试这样的事情:

Construction.objects.filter(id__in = [1,2])

它将返回具有 1,2 个 ID 的对象