Django rest框架过滤器编号小于列表

时间:2019-05-10 04:28:49

标签: python django django-rest-framework

我正在使用DRF并打包Django-Filter 1.1版。

在get调用中,我在下面的查询参数中传递了多个值,例如10、20、30、40,

http://websiteapi.comp/searchFilter?persona=name&age=10,20,30

因此基于 age 参数中发送的值,在本例中为10,20,30,我要获取所有小于 10,20的记录, 30个值。

下面是我的代码段

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

class SqureFeetFilter(Filter):
    def filter(self, qs, value):
        value_list = value.split(u',')
        return super(SqureFeetFilter, self).filter(qs, Lookup(value_list, 'range'))

class ProfileFiltter(django_filters.FilterSet):
    person = ListFilter(name='person')
    sf = SqureFeetFilter(name='age',lookup_expr='range')

    class Meta:
        model = Profile
        fields =  [ 'person','age']

class ProfileSearchVieset(viewsets.ModelViewSet):
        queryset = Profile.objects.all()
        serializer_class = ProfileSerializer
        permission_classes = [IsAuthenticated]
        filter_backends = (DjangoFilterBackend,)
        filter_class =ProfileFiltter

通过使用range look_up表达式,当前可以在两个数字之间获取值,但是当有两个以上的值时,不能在传递的数字之间获取小于值。

示例:如果我通过?age = 10,20,30 ,则结果可能是这样的10,12,13,17,19,10,23 ,22,25,29,30。

请指导我

谢谢

1 个答案:

答案 0 :(得分:0)

Django过滤器使用Django字段查找执行过滤。

字段查询range转换为SQL BETWEEN子句,并且只能采用2个值来执行范围(上下限)。您不能将超过2个值传递给BETWEEN子句。

要能够对两个以上的值进行过滤,您需要使用相同的过滤器两次对不同的值进行过滤。像Filter(1,6)和Filter(9,12)

https://docs.djangoproject.com/en/2.2/ref/models/querysets/#range