2017-05-25 175 views
0

如何在Django REST框架中爲日期和數字執行範圍過濾器?其他過濾器(lt,gt等)工作正常。我試過很多變種,如:Django REST框架範圍過濾器

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還有當我點擊底部的「過濾器」字段,然後鏈接看起來像:

/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

首先,您的字段名稱爲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') 
    # ... 

然後你可以在查詢中的該字段上應用範圍過濾。

+0

謝謝你這麼快的回覆和修改。沒有'total_cost',只有'total_price',我的錯誤。現在我試過了: 'total_price = filters.RangeFilter(name ='total_price')' 但是在這種情況下可以只用params做請求,這是行不通的。 '/命令/ total_price_0 = 1000&total_price_1 = 5000' 可以做這樣的要求:? '/命令/ total_price_range = 1000,5000'? –

+0

https://github.com/philipn/django-rest-framework-filters#caveats--limitations - 這裏描述了爲什麼它desnt'作品...可能sollution:「使用基於CSV的過濾器,如從那些衍生BaseCSVFilter/BaseInFilter/BaseRangeFilter「我該如何使用它? –