2015-05-21 303 views
3

我使用Django,Django REST框架加上Django過濾器(alex/django-filter)。Django過濾器上的日期範圍

我有一個模型的字段start_date和end_date,我試圖建立一個日期api-端點應接收日期和響應項目在哪裏(開始日期<日期)和(end_date>日期)。 有一個日期範圍過濾器(https://django-filter.readthedocs.org/en/latest/ref/filters.html#daterangefilter),但我無法弄清楚如何使用它。這是我到目前爲止的代碼:

urls.py:

url(r'^api/sales/$', views.SaleItemList.as_view(), name='sales'), 

views.py:

class SaleItemFilter(django_filters.FilterSet): 
    city = django_filters.CharFilter(name='trade_item__vendor__city') 
    title = django_filters.CharFilter(name='trade_item__title') 
    date = django_filters.DateRangeFilter() 

    class Meta: 
     model = SaleItem 
     fields = ['sale_price', 'sale_date_start', 'sale_date_end', 'trade_item'] 

class SaleItemList(generics.ListAPIView): 
    queryset = SaleItem.objects.all() 
    serializer_class = SaleItemListSerializer 
    filter_class = SaleItemFilter 

serializers.py:

class SaleItemListSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = SaleItem 
     fields = ("sale_price", "sale_date_start", "sale_date_end", "trade_item", "slogan") 

我可以過濾確切日期到目前爲止:

/api/sales /?sale _date_start = 2015-05-22

回答

10

我不能說Django REST Framework你的問題的一部分,但我希望我可以藉助django-filter部分的一些見解!

如果您使用DateRangeFilter,結果將是下拉選項「任何日期」,「今天」,「過去7天」,「本月」和「今年」。

如果變量是「日期」,無論這些會給你一個日期範圍與標籤「日期範圍」:

date_range = DateRangeFilter(name='date') 
date = DateRangeFilter(label='Date_Range') 

不同的是,如果你使用的第一個,你可以使用你的變量「日期」,所以你可以給你的用戶選擇過濾開始日期,結束日期,或兩者(以獲取日期之間),所有使用相同的日期變量。

(一次只能在等號左邊使用「date」(或根本不使用))。

要獲取的開始和結束日期,這樣做:

start_date = DateFilter(name='date',lookup_type=('lt'),) 
end_date = DateFilter(name='date',lookup_type=('gt')) 

你不需要在元再次撥打「日期」,但你可以。你確實需要打電話。這可能是你的日期,或者你想過濾的其他領域。

下面是一個完整的代碼和截圖例如:

from django_filters import DateRangeFilter,DateFilter 
from wesapp.models import MyModel 

class SaleItemFilter(django_filters.FilterSet): 
    start_date = DateFilter(name='date',lookup_type=('gt'),) 
    end_date = DateFilter(name='date',lookup_type=('lt')) 
    date_range = DateRangeFilter(name='date') 

    class Meta: 
     model = SaleItem 
     fields = ['entered_by',] 

enter image description here