0

私は、定期的なイベントを次の形式 (Django モデル) のテーブルに格納するイベント ベースの AJAX アプリケーションに取り組んできました。

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 オブジェクトは正しく pickle 化されないため、オブジェクトをデータベースにシリアル化する独自のメカニズムを定義する必要があります。私は通常、rrule をインスタンス化するためのキーワード引数の JSON 表現を使用しました。厄介なエッジケースは、「月の第 2 月曜日」のようなものを保存したい場合、返される値が役に立たないため、MO(2) で追加の作業を行う必要があることです。説明するのは難しいですが、試してみると問題がわかります。

範囲内のすべての適格なイベントを効率的に見つける方法はわかりませんが、範囲と重複する可能性のあるすべてのイベント モデルを読み込む必要があります。そのため、最終的に使用するよりも潜在的に多くのデータを常にロードすることになります。負担を軽減するために、比較的スマートであることを確認してください。データベース自体に繰り返し処理を追加する人を除けば、これを改善する方法はわかりません。

于 2013-03-28T13:01:54.250 に答える