Django: как фильтровать по диапазону день/месяц без установки года
У меня есть модель курса, но я хочу добавить на нее дату доступного периода (optiona), но без учета года.
так я могу:
- хранить 2 даты и не учитывать годы в модели курса
- или хранить 4 числа (от_дня, от_месяца, до_дня, до_месяца) на модели курса
Во-первых, я не знаю, какое решение лучше (какой тип данных хранить, дату или числа?). Во-вторых, я не знаю, как фильтровать позже с проверкой фактической даты.
Если в курсах есть диапазон дат, например: 2022/12/20 - 2023/01/10, если мы 2023/01/18, то эти курсы должны быть исключены
import datetime
today = datetime.date.today()
def get_available_courses(self):
courses = self.account.get_courses().filter(
...
)
Нет необходимости устанавливать год, так как он должен учитывать любой год
Когда у вас есть объект datetime или date, вы можете фильтровать с помощью опций __month
и __day
.
Подобно этому:
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
)
Другим вариантом, как вы уже упомянули, было бы сохранение дня и месяца в вашей базе данных, без года.
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
)