2009-07-30 6 views
3

Ich arbeite an einer Kalenderanwendung in Django und möchte Ereignisse unterstützen, die sich unendlich oft nach einem bestimmten Startdatum wiederholen. Ich werde "Blockereignisse" speichern, wobei jeder Block Daten über ein bestimmtes Ereignis (Titel, Beschreibung ...) sowie das Muster, mit dem es wiederholt wird, und ein "Ablaufdatum" enthält. Auf diese Weise speichere ich nur einen Datensatz für eine Gruppe von möglicherweise mehreren hundert wiederholten Instanzen eines Ereignisses. Wenn ich eine "Ausnahme" machen möchte, kann ich diesen Ereignisblock um die Ausnahme aufteilen und jeden Block mit vorherigen und zukünftigen Blöcken verknüpfen.Unbegrenzte Wiederholung von Ereignissen im Djangokalender

Mein Problem ist, dass ich in der Lage sein möchte, Abfragen auszuführen, um alle "logische Ereignisse" innerhalb eines bestimmten Zeitraums abzurufen, als ob für jede Instanz einer Wiederholung ein neuer Ereignisdatensatz eingefügt wurde. Im Wesentlichen möchte ich ein Django-Modell für jedes Ereignis für meine Anwendung (und die Admin-App von django) offen legen, aber ein einzelnes, anderes Modell für jede Gruppe von Ereignissen in meiner Datenbank speichern. Ist das möglich, und wenn ja .. wie? Oder gibt es einen besseren Ansatz für das Wiederholen von Ereignissen?

Antwort

2

Ein möglicher Ansatz besteht darin, zwei verschiedene Modelle zu haben. Deine Ereignisse sind genau so, wie du sie hast. Dann haben Sie ein "Zeitspannen" -Modell. Sie können dann den Anfang und das Ende der Zeitspanne verwenden, um alle relevanten Ereignisse zu erfassen, die innerhalb der Zeitspanne liegen. Wenn Sie ein nicht flexibles Arrangement zeigen, kann das Zeitspannenmodell tatsächlich ein "CalendarDay" sein, und dann kann ein "Calendar" -Modell eine Woche (oder einen Monat oder was auch immer) von CalendarDays halten und diese Informationen verwenden, um das richtige zu erhalten Reihe von Ereignissen.

5

Werfen Sie einen Blick auf django-schedule, die bereits ein System dafür implementiert hat. Sie verwenden a Period class, das weiß, wie Ereignisse einzelner Ereignisse innerhalb eines bestimmten Zeitrahmens erfasst werden, und somit können sie eine unendliche Wiederholung unterstützen.

Wenn Sie reale einzelne Modellobjekte im Django-Administrator für jedes Auftreten eines wiederkehrenden Ereignisses manifestieren möchten, ist das ebenfalls möglich, aber Sie müssen auf unendliche Wiederholungen verzichten (Sie können einfach keine unendliche Zahl erzeugen) von Modellobjekten). Ich implementierte dies für ein Projekt: Jedes einzelne Occurrence-Objekt hatte einen optionalen ForeignKey zu einem Recurrence-Modell, das die Metadaten über die Wiederholung speicherte (d. H. "Wöchentlich montags ab diesem Datum"). In der save() - Methode des Recurrence-Objekts würde ich eines der verknüpften Occurrences löschen oder erstellen, die notwendig sind, um die neuen Daten abzugleichen.

Die erste Lösung ist eine überlegene allgemeine Lösung für das Problem, aber Sie müssen möglicherweise mehr UI-Arbeit selbst erledigen, da Sie nicht jedes Auftreten zu einer tatsächlichen Modellinstanz machen können.