Django: how to filter by day/month range without setting the year
I have a course Model but want to add an available period date (optiona) on it, but without concidering the Year.
so I can:
- store 2 dates and wont concidering the years on the Course model
- or store 4 numbers (from_day, from_month, to_day, to_month) on the Course model
First I don't know what is the best solutions (what type of data to store, date or numbers?) Second, I don't know how to filter later with checking the actual date.
If there is a date range in the courses, ex: 2022/12/20 to 2023/01/10, if we are the 2023/01/18, theses courses should be excluded
import datetime today = datetime.date.today() def get_available_courses(self): courses = self.account.get_courses().filter( ... )
No need to set a year because it should concider any year
When you have a datetime or date object, you can filter using the
course1 = Course( name='Course 1', start_date='2022-09-01', end_date='2022-12-31' ) course2 = Course( name='Course 2', start_date='2021-09-01', end_date='2021-12-31' ) courses = Course.objects.all() # below will return both course1 and course2, because the year is not checked. courses.filter( start_date__day=1 start_date__month=9, end_date__day=31, end_date__month=12 )
Another option, as you mentioned, would be to save the day and month in your database, without a year.
course1 = Course( name='Course 1', start_day=1, start_month=9, end_day=31, end_month=12 ) course2 = Course( name='Course 2', start_day=1, start_month=9, end_day=31, end_month=12 ) today = datetime.date.today() courses = Course.objects.all() # below will return both course1 and course2 courses.filter( start_day=1, start_month=9, end_day=31, end_month=12 )