在django日历中无限期重复事件

时间:2009-07-30 20:19:04

标签: django django-models calendar django-admin

我正在研究django中的日历应用程序,并希望支持在给定的开始日期之后重复无限次的事件。我将存储“块事件”,其中每个块包括关于特定事件(标题,描述......)的数据以及它重复的模式和“到期日期”。这样,我只为一组可能数百个重复的事件实例存储一条记录。如果我想创建一个“异常”,我可以围绕异常分割这个事件块,并将每个块链接到前一个和将来的块。

我的问题是我希望能够运行查询以在给定时间段内获取所有“逻辑事件”,就好像为每个重复实例插入了新的事件记录一样。 基本上我想向我的应用程序(和django的管理应用程序)显示每个事件的django模型,但是为我的数据库中的每组事件存储一个不同的模型。这是否可行,并且如果是这样......怎么样?或者有更好的方法来重复事件吗?

2 个答案:

答案 0 :(得分:5)

看看django-schedule,它已经为此实现了一个系统。他们使用知道如何在给定时间范围内收集单个事件发生的a Period class,因此它们可以支持无限重复。

如果你想在Django管理员中为每个重复发生的事件显示真实的单个模型对象,那也是可能的,但你必须放弃支持无限重复(你根本无法生成无限数量的模型对象)。我为一个项目实现了这个:每个单独的Occurrence对象都有一个可选的ForeignKey到Recurrence模型,它存储了有关重现的元数据(即“从这个日期开始的每周一周”)。在Recurrence对象的save()方法中,我将删除或创建匹配其新数据所需的任何链接的出现次数。

第一个解决方案是针对该问题的优秀通用解决方案,但您可能必须自己完成更多的UI工作,因为您无法将每次出现都发生在实际的模型实例中。

答案 1 :(得分:2)

一种可能的方法是拥有两种不同的模型。你的活动就像你拥有它们一样。然后有一个“时间跨度”模型。然后,您可以使用时间跨度的开始和结束来获取范围内的所有相关事件。如果您显示的是非灵活的安排,那么时间跨度模型实际上可能是“CalendarDay”,然后“日历”模型可能会持有一周(或月份,或其他)CalendarDays并使用该信息来获得正确的一系列事件。