1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[メモ] Django の DurationField を使って有効期間切れ判定をする

Last updated at Posted at 2021-08-16
本シリーズのトップページ
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

 

以上.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?