我一直致力于基于事件的AJAX应用程序,该应用程序以下列格式(Django模型)在表中存储重复事件:
event_id = models.CharField(primary_key=True, max_length=24)
# start_date - the start date of the first event in a series
start_date = models.DateTimeField()
# the end date of the last event in a series
end_date = models.DateTimeField()
# Length of the occurence
event_length = models.BigIntegerField(null=True, blank=True, default=0)
rec_type = models.CharField(max_length=32)
rec_type以下列格式存储数据:
[type]_[count]_[day]_[count2]_[days]#[extra]
type - the type of repeation: 'day','week','month','year'.
count - the interval between events in the “type” units.
day and count2 - define a day of a month ( first Monday, third Friday, etc ).
days - the comma-separated list of affected week days.
extra - the extra info that can be used to change presentation of recurring details.
例如:
day_3___ - each three days
month _2___ - each two month
month_1_1_2_ - second Monday of each month
week_2___1,5 - Monday and Friday of each second week
这很好用,并允许简洁地传输许多事件,但我现在要求提取在给定范围内发生的所有事件。例如,在特定的日期,周或月,我有点失去了如何最好的方法。
特别是,我仍然坚持如何检查具有给定重复模式的事件是否有资格进入结果。
这里最好的方法是什么?
答案 0 :(得分:0)
就个人而言,我会从python-dateutil(http://labix.org/python-dateutil)存储一个rrule对象,而不是发明你自己的重复格式。然后,您可以定义一些使用rrule. between(after, before)
生成给定范围的事件对象实例的方法。
虽然有一个问题,但是dateutil的rrule对象没有正确地腌制,所以你应该定义自己的将对象序列化到数据库的机制。我通常使用关键字参数的JSON表示来实例化rrule。令人讨厌的边缘情况是,如果你想存储诸如“本月的第二个星期一”之类的东西,你必须使用MO(2)做额外的工作,因为它返回的值没有用。这很难解释,但是当你尝试它时你会看到问题。
我不知道找到某个范围内所有符合条件的事件的有效方法,但您必须加载可能与该范围重叠的所有事件模型。因此,您将始终加载可能比最终使用的数据更多的数据。只要确保相对聪明,减轻负担。没有人向数据库本身添加重复处理,我不知道有任何改进方法。