Django REST 框架范围过滤器

Dan*_*kov 4 django range filter 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
    ....
Run Code Online (Sandbox Code Playgroud)

在可浏览的 api 中,当我点击底部的“过滤器”时有一些字段,然后 url 看起来像:

/orders/?created_at__range_0=2017-05-22&created_at__range_1=2017-05-22
Run Code Online (Sandbox Code Playgroud)

它不起作用。我需要类似的东西

/orders/?created_at__range=2017-05-22,2017-05-24
Run Code Online (Sandbox Code Playgroud)

与整数相同:

/orders/?total_price__range=1000,2000
Run Code Online (Sandbox Code Playgroud)

它被描述为here

我究竟做错了什么?

Sov*_*iut 6

首先,你有total_price你的字段名,但你的 URL 是total_cost

其次,__range从过滤器名称中删除后缀。任何东西__都是 Django 过滤的一部分。例如,如果你在 Django 中查询一个模型的值大于你会做的事情:

MyModel.objects.filter(price__gte=50)
Run Code Online (Sandbox Code Playgroud)

注意__gte后缀;这就是 Django 过滤修饰符的方式。所以你的班级应该是这样的:

class OrderFilter(filters.FilterSet):
    total_price = filters.RangeFilter(name='total_price')
    # ...
Run Code Online (Sandbox Code Playgroud)

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