【问题标题】:Django REST framework range filterDjango REST 框架范围过滤器
【发布时间】:2017-10-26 04:41:08
【问题描述】:

如何在 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

我做错了什么?

【问题讨论】:

    标签: django filter range django-rest-framework


    【解决方案1】:

    首先,您的字段名称为 total_price,但您的 URL 显示为 total_cost

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

    MyModel.objects.filter(price__gte=50)
    

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

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

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

    【讨论】:

    • 感谢您这么快的回复和修改。没有total_cost,只有total_price,我的错误。现在我尝试了:total_price = filters.RangeFilter(name='total_price') 但在这种情况下可以只使用参数请求,这是行不通的。 /orders/?total_price_0=1000&total_price_1=5000 可以提出如下请求:/orders/?total_price_range=1000,5000 ?
    • github.com/philipn/… - 这里描述了为什么它不工作......可能的解决方案:“使用基于 CSV 的过滤器,例如从 BaseCSVFilter/BaseInFilter/BaseRangeFilter 派生的过滤器”我该如何使用它?
    猜你喜欢
    • 2014-02-17
    • 1970-01-01
    • 2012-12-24
    • 2017-05-27
    • 2018-05-17
    • 1970-01-01
    • 2019-08-03
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多