How to Filter Query Objects by Date Range in Django

How do I filter query objects by date range in Django?

Use

Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])

Or if you are just trying to filter month wise:

Sample.objects.filter(date__year='2011', 
date__month='01')

Edit

As Bernhard Vallant said, if you want a queryset which excludes the specified range ends you should consider his solution, which utilizes gt/lt (greater-than/less-than).

How to filter records by range of date in django?

Yes, say the model looks like:

class MyModel(models.Model):
date = models.DateField()

You can get all MyModel objects between 2018-1-1 and 2018-2-9 with:

from datetime import date

MyModel.objects.filter(date__range=(date(2018,1,1), date(2018, 2, 9)))

You can thus use a form like:

class DateRangeForm(forms.Form):
start_date = forms.DateField()
end_date = forms.DateField()

and then filter in the view like:

def my_view(request):
if request.method == 'POST':
form = DateRangeForm(request.POST)
if form.is_valid():
qs = MyModel.objects.filter(date__range=(
form.cleaned_data['start_date'],
form.cleaned_data['end_date']
))
# do something
else:
# do something
pass
else:
# do something
pass

How to implement date range filter in django-filters

I think you need to create MetaDataFilter.

from django_filters import rest_framework as filters

class MetaDataFilter(filters.FilterSet):
upload_date = filters.DateFromToRangeFilter()

class Meta:
model = MetaData
fields = ['upload_date']

In the view, you can set the filterset_class

class FetchMetaData(ListCreateAPIView):
...
filterset_class = MetaDataFilter

Then, the api url should be .../filterMetadata/?upload_date_before=2022-01-05&upload_date_after=2022-01-05.

Django - Filter objects by DateTimeField with a date range

When you filter DateTime field, the value which is used to compare must has type of Python DateTime. You can use datetime.strptime to format DateTime variable from string, then apply operators like __gte __lte ... to filter.

Filter a model by date range of next week in Django

You can use datetime.timedelta

import datetime

def next_week():
today = datetime.date.today()
return [
today + datetime.timedelta(days=1),
today + datetime.timedelta(days=7)
]

And if you want to filter birthday OR anniversary, check Q objects

from django.db.models import Q

queryset = Model.objects.filter(
Q(birthday__range=next_week()) | Q(anniversary__range=next_week())
)

To schedule use your favorite external tool, something like cron. I suggest to create your task as a management command



Related Topics



Leave a reply



Submit