2017-10-06 40 views
1

我需要关于django重复发生的帮助。我想从一个模型复发场获得下一个和最后一个实例,如图所示:django重复 - 获取重复字段的最后一个实例

course = Course.objects.all() for c in course: occurrence = c.recurrences.occurrences() print(occurrence[0]) print(occurrence[-1])

这种方法的作品,但它是非常缓慢的。这里是来自递交包作者的comment,并建议使用之间的两个日期,但因为我需要在某些情况下是无限的最后一个实例(结束年份为9999),它没有帮助的性能。

有没有更好的选择从循环字段中获取下一个和最后一个实例?

回答

1

主要元凶是规则occurrence = c.recurrences.occurrences()的用法,没有定义结束日期。它必须建立一个开始日期到9999年的Python对象,这个对象非常大,性能不好。

通常重复字段保存这样一个表: RRULE:FREQ=MONTHLY;UNTIL=20180315T040000Z;BYMONTHDAY=15

假设重复字段名称为复发。然后,不要对所有记录执行occurrence = c.recurrences.occurrences(),首先检查,直到每个重复字段中的字段。如果存在,那就意味着有一天结束。如果结束日期为occurrence = c.recurrences.occurrences(),则会生成一个小型python对象(类似于在之间使用),否则最终实例的年份为9999,在这种情况下,您不需要使用occurrences()调用。

我测试了这个,速度很快。

course = Course.objects.all() 
for c in course: 
    if c.recurrences.rrules[0].until is None: 
     print('No End date') 
    else: 
     occurrence = c.recurrences.occurrences() 
     print(occurrence[0]) 
     print(occurrence[-1])