0

我一直在开发一个基于事件的 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 

这工作正常,并允许简洁地传输许多事件,但我现在需要提取在给定范围内发生的所有事件。例如,在特定的日期、星期或月份,我对如何最好地接近有点迷茫。

特别是,我被困在如何检查具有给定重复模式的事件是否有资格出现在结果中。

这里最好的方法是什么?

4

1 回答 1

0

就个人而言,我会从 python-dateutil ( http://labix.org/python-dateutil ) 存储一个 rrule 对象,而不是发明自己的重复格式。然后,您可以定义一些rrule. between(after, before)用于为给定范围生成事件对象实例的方法。

但是有一个问题,dateutil 的 rrule 对象不能正确腌制,因此您应该定义自己的将对象序列化到数据库的机制。我通常使用 JSON 表示的关键字参数来实例化规则。恼人的边缘情况是,如果你想存储像“每月第二个星期一”这样的东西,你必须对 MO(2) 做额外的工作,因为它返回的值没有用。这很难解释,但是当你尝试它时你会发现问题。

我不知道有任何有效的方法可以在一个范围内找到所有符合条件的事件,但您必须加载所有可能与该范围重叠的事件模型。因此,您将始终加载可能比最终使用更多的数据。只要确保它相对聪明,以减轻负担。由于没有人自己向数据库添加重复处理,我不知道有什么方法可以改进这一点。

于 2013-03-28T13:01:54.250 回答