Бесконечно повторяющиеся события в календаре Джанго - PullRequest
3 голосов
/ 31 июля 2009

Я работаю над приложением календаря в django и хочу поддерживать события, которые повторяются бесконечное количество раз после указанной даты начала. Я буду хранить «блочные события», где каждый блок содержит данные об определенном событии (заголовок, описание ...), а также шаблон, с которым оно повторяется, и «дату истечения». Таким образом, я сохраняю только одну запись для группы, возможно, сотни повторяющихся случаев события. Если я хочу создать «исключение», я могу разделить этот блок событий вокруг исключения и связать каждый блок с предыдущими и будущими блоками.

Моя проблема в том, что я хочу иметь возможность запускать запросы для извлечения всех «логических событий» в течение заданного периода времени, как если бы для каждого экземпляра повторения была вставлена ​​новая запись события. По сути, я хочу раскрыть модель django для каждого события в моем приложении (и в приложении администратора django), но сохранить в моей базе данных отдельную, отличную модель для каждой группы событий. так как? Или есть лучший подход к повторению событий?

Ответы [ 2 ]

5 голосов
/ 31 июля 2009

Взгляните на django-schedule , который уже внедрил систему для этого. Они используют класс Period , который знает, как собирать отдельные события в течение определенного периода времени, и, таким образом, они могут поддерживать бесконечное повторение.

Если вы хотите манифестировать реальные отдельные объекты модели в администраторе Django для каждого повторяющегося события, это тоже возможно, но вам придется отказаться от поддержки бесконечного повторения (вы просто не можете генерировать бесконечное число модельные объекты). Я реализовал это для одного проекта: каждый отдельный объект Occurrence имел необязательный ForeignKey для модели Recurrence, в которой хранились метаданные о повторении (т. Е. «Еженедельно по понедельникам, начинающимся с этой даты»). В методе save () объекта Recurrence я бы удалил или создал любые связанные с ним вхождения, необходимые для соответствия его новым данным.

Первое решение - это превосходное общее решение проблемы, но вам, возможно, придется выполнять больше работы с пользовательским интерфейсом самостоятельно, поскольку вы не можете превратить каждое вхождение в реальный экземпляр модели.

2 голосов
/ 31 июля 2009

Один из возможных подходов - использовать две разные модели. Ваши события такие же, как у вас. Тогда имейте модель "временного промежутка". Затем вы можете использовать начало и конец промежутка времени, чтобы получить все соответствующие события, которые попадают в промежуток. Если вы показываете негибкое расположение, модель временного промежутка может фактически быть «CalendarDay», и тогда модель «Calendar» может содержать неделю (или месяц, или что-то еще) CalendarDays и использовать эту информацию для получения правильной множество событий.

...