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。
我究竟做错了什么?
首先,你有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)
然后,您可以对查询中的该字段应用范围过滤。
| 归档时间: |
|
| 查看次数: |
5570 次 |
| 最近记录: |