Django: Filter Model on Date Range
A generic filter function to filter query results by data ranges
Photo by Eliza Diamond on Unsplash
I'm sure this is in the documentation somewhere but it wasn't totally obvious to me and I knew there had to be an easy way to filter a model based on a date range. I'm in the process of filtering transactions for Inzolo and giving the user options for the following date filters:
- Month to date
- Last month
- Past week
- Past 2 weeks
- Last 30 days
- Last 60 days
- Last 90 days
- All transactions
There really is easy ways to do all of these, but they are slightly different. What I got hung up on was the range. My assumption would be to do something like .filter(date >= begin_date, date <= today) but that obviously won't work. I finally found what I needed with the range function.
So to get each of the filters to work, I created a filter function that looks like this (I'll let you read between the lines to figure out what it is doing):
def filter_trans(request, trans):
today = date.today()
if 'filter' in request.POST:
fltr = request.POST['filter']
if fltr == 'this_month':
trans = trans.filter(date__year=today.year, date__month=today.month)
elif fltr == 'last_month':
year = today.year
month = today.month - 1
if month == 0:
month = 12
year = year - 1
trans = trans.filter(date__year=year, date__month=month)
elif fltr[:4] == 'last':
days = int(fltr[4:])
trans = filter_trans_days(trans, today, days)
elif fltr == 'all':
return trans
else:
trans = trans.filter(date__year=today.year, date__month=today.month)
return trans
def filter_trans_days(trans, today, days):
days = timedelta(days=days)
begin = today - days
return trans.filter(date__range=(begin, today))