Daterange on django filter

I am using Django, Django REST Framework plus django filters (alex / django-filter).

I have a model with start_date and end_date fields and I am trying to create an api-endpoint date that should receive the date and respond to items where (start_date <date) and (end_date> date). There is a date range filter ( https://django-filter.readthedocs.org/en/latest/ref/filters.html#daterangefilter ) but I can't figure out how to use it. Here is my code:

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")

      

I can filter for exact dates:

/ API / sales /? Sale_date_start = 2015-05-22

+3


source to share


4 answers


I can't talk to the Django REST Framework part of your question, but I hope I can provide some insight into the django filter part!

If you use DateRangeFilter, the result will be a dropdown list with options "any date", "today", "last 7 days", "this month" and "this year".

If your variable is "date", either of these will give you a date range labeled "Date Range":

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

      

The difference is that if you use the former, you can reuse your "date" variable so that you can give your user the ability to filter by start date, end date, or both (to get dates in between), everyone uses the same date variable.

(You can only use the "date" to the left of the equal sign once (or not at all)).



To get the start and end date, follow these steps:

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

      

You no longer need to name "date" in "Meta", but you can. You need to name something. This could be your date or another field that you want to filter out.

Here's an example of the complete code and screenshot:

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

+12


source


You can also try DateFromToRangeFilter

This will allow you to do this:

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

      



Where F is class FilterSet

cdate = DateFromToRangeFilter

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

+2


source


just edit your current django version, replace name

with field_name

, replace lookup_type

with lookup_expr

:

An example is given below for the filters.py file

from django.contrib.auth.models import User
import django_filters

class UserFilter(django_filters.FilterSet):       
    username = django_filters.CharFilter(lookup_expr='icontains')
    first_name = django_filters.CharFilter(lookup_expr='icontains')
    last_name = django_filters.CharFilter(lookup_expr='icontains')
    year_joined = django_filters.NumberFilter(field_name='date_joined', lookup_expr='year',label='Year Joined')
    year_joined__gt = django_filters.NumberFilter(field_name='date_joined', lookup_expr='year__gt',label='Year Joined Greater Than')
    year_joined__lt = django_filters.NumberFilter(field_name='date_joined', lookup_expr='year__lt',label='Year Joined Less Than')
    date_range = django_filters.DateRangeFilter(field_name='date_joined')
    start_date = django_filters.DateFilter(field_name='date_joined',lookup_expr='lt',label='Date joined is before (mm/dd/yyyy):')
    end_date = django_filters.DateFilter(field_name='date_joined',lookup_expr='gt',label='Date joined is after (mm/dd/yyyy):')
    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', ] 

      

0


source


I know this is an old post, but to give a further answer, you can also include the from and to the DatePicker in the following way. Datepicker using django_filters.

import django_filters
from django_filters.widgets import RangeWidget

Date = django_filters.DateFromToRangeFilter(widget=RangeWidget(attrs={'type': 'date'}))

      

0


source







All Articles