本シリーズのトップページ |
---|
https://qiita.com/robozushi10/items/4559a281d0319eb62c6c |
はじめに
ある model のメンバに有効期間(有効時間)を持たせておき、
その後、一定周期の監視の際に有効期限切れであるか否かを判定する実装例.
具体的には以下である.
ユーザが 1月1日 00:00:00 に有効期間「90分間」と入力すれば、
有効期限は 1月1日 01:30:00 となる
一見簡単に思えたが、Django では苦戦したので書き残しておく.
何か泥臭い方法で他に良い方法がありそうな気もするが...
models.py
class XXXX(models.Model):
# ユーザに有効期間を「HH:MM:SS」形式で入力させる.
# ユーザによる時間入力が無ければ、90分間とする.
duration = models.DurationField(verbose_name='有効期間',
default=timedelta(minutes=90),
null=True,
blank=True,
help_text=('HH:MM:SS'))
# 失効時刻 を設定するためのメンバである.
# 「ユーザが入力したときの日時」に上記 duration を加算した時刻が入る.
# 例: ユーザ 1/1 00:00:00 に 90分間と入力すれば、有効期限は 1/1 01:30:00 となる
expired_at = models.DateTimeField(verbose_name='失効時刻',
null=True, blank=True)
略
失効時刻の設定をする
上記「expired_at」に失効時刻を設定する.
ここでは、現在時刻(now) から 90分後 を失効時刻 とする.
なお「90分」というのは、上記 models.py の duration の初期値であり、
ユーザが時刻指定をしなかった場合である.
## 見本のために、ここでは適当に 1件取り出す
x = XXXX.objects.all()[0]
## 現在時刻を得る
now = timezone.now()
## 「失効時刻」を現在時刻(now)から 90分加算した時刻とする
x.expired_at = now + timezone.timedelta(seconds=x.duration.total_seconds())
有効期間が切れていないか判定をする
## 現在時刻を得る
now = timezone.now()
## 現在時刻 > 失効時刻 という関係が成立するので 有効期間切れ(失効) となる
if((now - x.expired_at).total_seconds() > 0):
print("失効しました")
else:
print("有効期間内です")
参考サイト
URL |
---|
https://stackoverflow.com/questions/33834562/set-value-for-django-durationfield-type-in-query |
以上.