Исключение объектов с соответствующим диапазоном дат
Используя эти (упрощенные, конечно) модели:
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()