簡體   English   中英

如何使計時器距離創建日期 Django 正好 30 秒

[英]How to make a Timer exactly 30 seconds from created date Django

我需要使操作僅在 30 秒內可用,然后它就會過期。 我有這個模型:

(手術)

status = CharField(max_length=10, default="INI")
created_at = DateTimeField(auto_now_add=True)
account = ForeignKey(Account, null=False, on_delete=CASCADE)
metadata = models.JSONField(default=dict)
external_ref = CharField(max_length=128)
expires_at = DateTimeField(default=timezone.now()+timezone.timedelta(seconds=30))

我希望能夠在 expires_at 字段中創建一個與 created_at 日期正好 30 秒的時間戳,它就像一個超時函數,但是當我運行測試時:

    def test_timeout_is_30_seconds(self):
        print(self.operation.created_at)
        timer = self.operation.created_at + timezone.timedelta(seconds=30)
        print(timer)
        self.assertEqual(self.operation.expires_at, timer)

它失敗並顯示以下消息:

AssertionError: datetime.datetime(2021, 6, 22, 19, 0, 42, 537490, tzinfo=<UTC>) != datetime.datetime(2021, 6, 22, 19, 0, 45, 844588, tzinfo=<UTC>)

我不知道我是否需要在類內部或直接在視圖中創建外部函數或方法,但我更喜歡模型中的這種默認行為,所以我不需要擔心設置到期日期

如果您能幫我解決,我將不勝感激! :D 任何提示和信息表示贊賞

這是一個常見的錯誤。 您的表達式timezone.now()+timezone.timedelta(seconds=30)在定義類時被評估一次,並且該值被用作每個實例的默認值。

您真正想要的是每次創建新實例時重新計算到期時間。 這意味着您要為函數設置default

def half_minute_hence():
   return timezone.now() + timezone.timedelta(seconds=30)

expires_at = DateTimeField(default=half_minute_hence)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM