Исключение объектов с соответствующим диапазоном дат

Используя эти (упрощенные, конечно) модели:

class Person(models.Model):
    name = models.CharField()

class InactivePeriod(models.Model)
    person = models.ForeignKeyField(Person)
    start_date = models.DateField()
    end_date = models.DateField()

class Template(models.Model):
    day = models.CharField() #choices = monday, tuesday, etc...
    person = models.ForeignKeyField(Person)

class TheList(models.Model):
    person = models.ForeignKeyField(Person)
    date = models.DateField(default=datetime.today)
    attended = models.BooleanField(default=False)

У меня есть рабочий процесс, в котором люди звонят, чтобы записаться на ежедневное мероприятие (онлайн-регистрации не будет). Первоначально мои пользователи собирались вручную вводить данные о каждом участнике каждый день, когда они звонят, создавая запись TheList, а затем отмечать, присутствовали ли они на мероприятии. Однако, поскольку на каждом мероприятии есть постоянные участники, которые обычно приходят в одни и те же дни. Было решено, что я предоставлю таблицу Template, в которой пользователь сможет указать, что «Майк» является постоянным посетителем в «понедельник», а затем я буду использовать cronjob для автоматического заполнения таблицы TheList записями о людях, которые являются постоянными посетителями в этот день. Затем мой пользовательский интерфейс будет автоматически фильтровать представление списка TheList до участников текущего дня, и тогда мои пользователи смогут вносить любые изменения по мере необходимости. Это просто уменьшит количество вводимых данных, которые им нужно будет сделать.

Сложность заключается в том, что мои пользователи попросили предоставить им возможность назначить кого-либо неактивным на определенный период времени. Если у Person есть связанная с ним запись InactivePeriod, где «сегодня» попадает между start_date и end_date, мой cronjob будет опускать эту запись Person. Я решил отказаться от простого «активного» BooleanField, так как думаю, что им будет проще не помнить, неактивен кто-то или нет, и не беспокоиться о том, чтобы сообщить о том, что они пометили кого-то неактивным, другому пользователю.

Мой сценарий по сути таков:

def handle(self, *args, **options):
    today = datetime.today()
    day = str(today.weekday()) #we store this as a string as it is a charfield

    is_inactive_today = (Q(person__inactiveperiod__start_date__lte=today) & \ 
                         Q(person__inactiveperiod__end_date__gte=today))

    attendance_list = []
    for t in models.Template.objects.filter(day=day).exclude(is_inactive_today):
        attendance_list.append(models.TheList(person=t.person, date=today))
    models.TheList.objects.bulk_create(attendance_list)

при условии, что «сегодня» - это 10/11/2024 (11 октября 2024 года), если я добавляю два InactivePeriod для Person, где диапазоны дат - (10/9/2024, 10/10/2024) и (10/12/2024, 10/13/2024), запрос некорректно не возвращает связанную с этим Person запись Template, несмотря на то, что обе их InactivePeriod не включают сегодняшний день, и поэтому я не могу создать соответствующую запись TheList. Если я удалю одну из записей, оставив только одну запись InactivePeriod, запрос успешно вернет связанную запись Template.

Можно ли это сделать с помощью ORM или мне нужно написать какую-то логику в цикле for?

БД Django хранит данные о времени, включая информацию о часовом поясе.

Проблемы, возникающие в результате этого, вполне ожидаемы. Вместо datetime попробуйте использовать встроенный в Django timezone.

Похоже, что ваша модель и представление нуждаются в модификации.

from django.utils import timezone

now = timzone.now()
Вернуться на верх