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
)


Вернуться на верх