Django REST框架范围过滤器

时间:2017-05-25 13:38:35

标签: django filter range django-rest-framework

如何在Django REST Framework中为日期和数字进行范围过滤?其他过滤器(lt,gt等)工作正常。我尝试过很多变种,例如:

import rest_framework_filters as filters

class OrderFilter(filters.FilterSet):
    total_price__range = filters.RangeFilter(name='total_price')
    created_at__range = filters.DateFromToRangeFilter(name='created_at')
    ....
    class Meta:
        model = Order

        fields = {
            'created_at__range': ['__all__'],
            'total_price__range': ['__all__'],
            ...
            }

class OrderViewSet(BaseViewSet, viewsets.ModelViewSet):
    filter_class = OrderFilter
    ....

在可浏览的api中,当我点击底部"过滤器"时会出现字段,然后url看起来像:

/orders/?created_at__range_0=2017-05-22&created_at__range_1=2017-05-22

并且它不起作用。我需要像

这样的东西
/orders/?created_at__range=2017-05-22,2017-05-24

与整数相同:

/orders/?total_price__range=1000,2000

有人对此进行了描述here

我做错了什么?

1 个答案:

答案 0 :(得分:4)

首先,您已将total_price作为字段名称,但您的网址为total_cost

其次,从过滤器名称中删除__range后缀。 __的任何内容都是Django过滤的一部分。例如,如果您在Django中查询模型的值大于您要执行的操作:

MyModel.objects.filter(price__gte=50)

注意__gte后缀;这就是Django如何过滤修饰符。所以你的课应该是这样的:

class OrderFilter(filters.FilterSet):
    total_price = filters.RangeFilter(name='total_price')
    # ...

然后,您可以在查询中对该字段应用范围过滤。