1

Django-REST-Framework で get_queryset を使用して、アプリの API を構築しています。

このフィルターを機能させる方法があるかどうか知りたい

http://api/data?district=ナシク、プネー

地区「Pune」または地区「Nasik」のすべてのデータを取得します。私は試してみました

http://api/data?district=Nasik&district=Pune ですが、予想どおり、フィルター間で AND を実行し、Pune 地区のみを取得します (これが最後のフィルターであるためだと思います)。

これが私のコードです:

from rest_framework_mongoengine.viewsets import ModelViewSet as MongoModelViewSet
from app.serializers import *
from mongoengine.queryset.visitor import Q

class ToolViewSet(MongoModelViewSet):

    serializer_class = ToolSerializer

    def get_queryset(self, *args, **kwargs):
        queryset_list =Tool.objects.all()
        fruit=self.request.query_params.get("fruit")
        district=self.request.query_params.get("district")
        taluka=self.request.query_params.get("taluka")

        if fruit and district:
            queryset_list = queryset_list.filter(
            Q(fruit__icontains=fruit)
            &Q(district__icontains=district)
            )
            return queryset_list

        if fruit and taluka:
            queryset_list = queryset_list.filter(
            Q(fruit__icontains=fruit)
            &Q(taluka__icontains=taluka)
            )
            return queryset_list


        if district and taluka:
            queryset_list = queryset_list.filter(
            Q(district__icontains=district)
            &Q(taluka__icontains=taluka)
            )
            return queryset_list

        elif fruit:
            queryset_list = queryset_list.filter(
            Q(fruit__icontains=fruit)
            )
            return queryset_list

        elif district:
            queryset_list = queryset_list.filter(
            Q(district__icontains=district)
            )  
            return queryset_list

        elif taluka:
            queryset_list = queryset_list.filter(
            Q(taluka__icontains=taluka)
            )  
            return queryset_list

したがって、このコードは2つの異なるフィールドで機能し、

例えば:

http://api/?data?fruit=Banana&district=プネー

http://api/?data?fruit=Banana&taluka=Haveli

http://api/?data?taluka=Haveli&district=プネ

すべて動作していますが、

http://api/data?district=ナシク、プネー

これは機能しません。ここでは、このコードを「OR」に使用します

if district or district:
    queryset_list = queryset_list.filter(
        Q(district__icontains=fruit)
        |Q(district__icontains=district)
    )
    return queryset_list

しかし、それは機能していません。これを解決する方法はありますか?

4

1 に答える 1

1

これには新しいフィルタを定義する必要があります。django-filterの問題への参照としてhttps://github.com/carltongibson/django-filter/issues/137

from django_filters import Filter
from django_filters.fields import Lookup

class ListFilter( Filter ):
  def filter( self, qs, value ):
    return super( ListFilter, self ).filter( qs, Lookup( value.split( u"," ), "in") )

get_queryset メソッドで値 Pune と Nashik の両方を取得しましたか?

注: - 更新

Cloud の両方の地区の値を取得するには、このコードを試してください。

fields = request.query_params.get('district ')
    if fields:
        fields = fields.split(',')
        dis = set(fields)  # dis is a set of all request param value.
于 2016-12-27T12:22:15.627 に答える