簡體   English   中英

DRF:在一個請求中過濾多個字段

[英]DRF: Filter several fields in one request

我必須實現一組過濾器(見圖)。 我的代碼適用於 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] 等等(不完美)

有沒有更好的方法來解決我的問題?

在此處輸入圖片說明

視圖.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)

如果您的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可以幫助您完成一些常見的工作。

如果你想通過他們的 ID 獲取多個對象,你可以嘗試這樣的事情:

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

它將返回具有 1,2 個 ID 的對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM