1

我正在使用 get_queryset 和 Django-REST-Framework 为我的应用程序构建 API。

我想知道是否有办法让这个过滤器工作

http://api/data?district=Nasik,浦那

获取“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

所以,这段代码适用于两个不同的领域,

例如:

http://api/?data?fruit=Banana&district=浦那

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

http://api/?data?taluka=Haveli&district=浦那

一切都在工作,但是,

http://api/data?district=Nasik,浦那

这不起作用,在这里我将此代码用于“或”

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 的值?

注意: - 更新

云你请试试这个代码,以获得两个区的值。

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 回答