Исключить объекты со связанным диапазоном датPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Исключить объекты со связанным диапазоном дат

Сообщение Anonymous »

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

Код: Выделить всё

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, где значение «сегодня» попадает между начальной_датой и конечной_датой этой записи, мое задание cron пропустит этого 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)
предполагая, что «сегодня» — 11 октября 2024 г. (11 октября 2024 г.), если я добавлю два InactivePeriod для Person, где диапазоны дат (9.10.2024, 10.10.2024) и (12.10.2024, 13.10.2024) запрос ошибочно не возвращает запись шаблона, связанную с этим Person, несмотря на тот факт, что оба их InactivePeriod не включают сегодняшний день, и поэтому я не могу создать соответствующую запись TheList. Если я удалю любую из записей, оставив только одну запись InactivePeriod, запрос успешно вернет связанную запись Template.
Можно ли это сделать с помощью ORM или мне нужно написать какую-то логику в цикл for?

Подробнее здесь: https://stackoverflow.com/questions/790 ... date-range
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»