django-model-utilsをいろいろ試してみる その2 TimeFramedModel

昨日の続きでdjango-model-utilsを試してみる。


今日はTimeFramedModel。

開始時刻と終了時刻をフィールドにもつようなモデルの場合に使える。

from model_utils.models import TimeFramedModel


class Event(TimeFramedModel):
    name = models.CharField(max_length=100)


TimeFramedModelを継承したモデルはstartとendという名前のフィールドを持ちます。

from datetime import datetime, timedelta
import pytz

start = datetime.utcnow().replace(tzinfo=pytz.utc) - timedelta(days=1)
end = datetime.utcnow().replace(tzinfo=pytz.utc) + timedelta(days=1)
event = Event.objects.create(name='the event', start=start, end=end)


またTimeFramedModelを継承したモデルはtimeframedというQueryManagerを持つようになります。
timeframedは現在時刻がstartとendの範囲内であるレコードを返します。

Event.timeframed.all()
#=> [<Event: the event>]

# 未来のeventを登録
start = datetime.utcnow().replace(tzinfo=pytz.utc) + timedelta(days=1)
end = datetime.utcnow().replace(tzinfo=pytz.utc) + timedelta(days=2)
event2 = Event.objects.create(name='future event', start=start, end=end)

# 未来のeventは返されない
Event.timeframed.all()
#=> [<Event: the event>]


timeframedが活躍するケースはわりと有りそう


関連 : django-model-utilsをいろいろ試してみる その1 StatusModel - brainstorm
参考 : carljm / django-model-utils / source / ― Bitbucket