2015-05-21 5 views
3

Я использую Django, Django REST Framework плюс django-фильтры (alex/django-filter).daterange на django-filter

У меня есть модель с полями start_date и end_date, и я пытаюсь создать дату api-endpoint, которая должна получать дату и отвечать на элементы где (start_date < date) и (end_date> 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!

Если вы используете DateRangeFilter, результатом будет выпадающий список с опциями «любая дата», «сегодня», «за последние 7 дней», «в этом месяце» и «в этом году».

Если переменная «дата», либо из них даст вам диапазон дат с меткой «Диапазон дат»:

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

Разница заключается в том, что если вы используете первый, вы можете использовать ваша переменная «дата» снова, так что вы можете дать своему пользователю возможность фильтровать по дате начала, дате окончания или обоим (для получения дат между ними), причем все используют одну и ту же переменную даты.

(Вы можете использовать только «дату» слева от знака равенства один раз (или вообще нет)).

Чтобы получить начальную и конечную дату, сделайте следующее:

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

Вам не нужно называть «дата» снова в Meta, но вы можете. Вам нужно что-то назвать. Это может быть ваша дата или другое поле, которое вы хотите фильтровать.

Вот полный код и скриншот пример:

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

2

Вы также можете попробовать DateFromToRangeFilter Это позволит вам сделать это:

f = F({'date_0': '2016-01-01', 'date_1': '2016-02-01'}) 

Где F является a FilterSet класс с date = DateFromToRangeFilter

http://django-filter.readthedocs.io/en/develop/ref/filters.html#datefromtorangefilter

+1

Как вы можете получить две коробки для каждой даты вместо 1? –

Смежные вопросы