Django的定期事件工具
django-eventtools的Python项目详细描述
django eventtools是一个轻量级库,旨在处理重复 以及在网站上显示的一次性事件。
安装
从https://pypi.python.org/pypi/django-eventtools/下载源代码 运行python setup.py install,或:
> pip install django-eventtools
要求Django 1.8或更高。
设置
提供以下型号:
from django.db import models from eventtools.models import BaseEvent, BaseOccurrence class MyEvent(BaseEvent): title = models.CharField(max_length=100) class MyOccurrence(BaseOccurrence): event = models.ForeignKey(MyEvent)
用法
创建事件和事件的示例
>>> from datetime import datetime >>> from myapp.models import MyEvent >>> event = MyEvent.objects.create(title='Test event') >>> once_off = MyOccurrence.objects.create( event=event, start=datetime(2016, 1, 1, 12, 0), end=datetime(2016, 1, 1, 2, 0)) >>> christmas = MyOccurrence.objects.create( event=event, start=datetime(2015, 12, 25, 7, 0), end=datetime(2015, 12, 25, 22, 0), repeat='RRULE:FREQ=YEARLY') >>> daily = MyOccurrence.objects.create( event=event, start=datetime(2016, 1, 1, 7, 0), end=datetime(2016, 1, 1, 8, 0), repeat='RRULE:FREQ=DAILY')
事件和事件实例及其关联的查询集,全部 支持all_occurrences方法,它接受两个可选的 参数-from_date和to_date,可以是日期或 约会时间。from_date和to_date默认为None。方法 返回一个python生成器,生成以下格式的元组 (start, end, instance)-例如:
>>> MyEvent.objects.all().all_occurrences() >>> event.all_occurrences(from_date=datetime(2015, 1, 1, 10, 0)) >>> event.occurrence_set.all().all_occurrences(to_date=date(2016, 1, 1)) >>> occurrence.all_occurrences(from_date=date(2016, 1, 1), to_date=date(2016, 12, 31))
instance是相应baseoccurrence的实例 子类。
还提供了一个next_occurrence方法,采用相同的 参数,但返回单个出现元组。
>>> event.next_occurrence() >>> event.next_occurrence(from_date=date(2016, 1, 1))
方法first_occurrence还返回一个出现元组, 但不需要争论。
查询集过滤
事件和发生查询集可以过滤,但由于不确定性 重复,^ {Tt3} $过滤只是一个近似值。 (而to_date过滤是准确的)。如果你需要一个查询集 完全过滤,通过exact=True-这将使用生成的 但是仍然返回一个queryset-但是要小心这个 可能非常慢和/或CPU不足。例如
>>> MyEvent.objects.for_period(from_date=date(2015, 1, 1), to_date=date(2015, 12, 31)) >>> event.occurrence_set.for_period(from_date=date(2015, 1, 1), exact=True)
排序查询集
事件和事件查询集也可以按其下一个排序 使用sort_by_next方法发生。默认情况下,此排序 实例的第一次出现;可选的from_date参数 将按from_date之后的下一个匹配项排序。例如
>>> MyEvent.objects.all().sort_by_next() >>> event.occurrence_set.for_period(from_date=date(2015, 1, 1)) \ >>> .sort_by_next(date(2015, 1, 1))
请注意,此方法返回的是已排序的列表,而不是queryset。
自定义重复间隔
事件可以使用任何可以表示为 rrulestr。 若要自定义可用选项,请在中设置EVENTTOOLS_REPEAT_CHOICES 你的django设置。默认值为
EVENTTOOLS_REPEAT_CHOICES = ( ("RRULE:FREQ=DAILY", 'Daily'), ("RRULE:FREQ=WEEKLY", 'Weekly'), ("RRULE:FREQ=MONTHLY", 'Monthly'), ("RRULE:FREQ=YEARLY", 'Yearly'), )
设置EVENTTOOLS_REPEAT_CHOICES = None使重复成为纯文本 字段。