首页 > 解决方案 > Django rest框架过滤器数量少于列表

问题描述

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

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

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

所以根据年龄参数中发送的值,在本例中为 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

当前通过使用范围查找表达式,我能够获得两个数字之间的值,但是当有超过 2 个值时,无法在传递的数字之间获得小于值。

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

请指导我

谢谢大家

标签: pythondjangodjango-rest-framework

解决方案


Django Filter 使用 Django Field Lookups 来执行过滤。

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

为了能够过滤超过 2 个值,您需要使用不同的值两次应用相同的过滤器。像过滤器(1,6)和过滤器(9,12)

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


推荐阅读