web-dev-qa-db-ja.com

Django default = timezone.now + delta

Djangoモデルでキーの有効期限のタイムスタンプを設定しようとして、この問題にぶつかりました:

私の現在のコード:

key_expires = models.DateTimeField(default=timezone.now() + timezone.timedelta(days=1))

上記のコードは機能しますが、「timezone.now()」を使用すると、Apacheが再起動された時刻からタイムスタンプが取得されるため、これは機能しません。私はいくつかの研究を行い、問題のその部分の解決策を見つけたので、「timezone.now()」を「timezone.now」に置き換えることにより、オブジェクトが作成されるたびに現在のタイムスタンプを取得します。 、問題は部分的に解決されました。

「timezone.timedelta(days = 1)」を使用して日付を変更するのに問題があります。

key_expires = models.DateTimeField(default=timezone.now + timezone.timedelta(days=1))

私が得ているエラーは:

key_expires = models.DateTimeField(default=timezone.now + timezone.timedelta(days=1))

TypeError:+のサポートされていないオペランドタイプ: 'function'および 'datetime.timedelta'

目標は、24時間先にタイムスタンプを設定することです。

どんな助けも大歓迎です。

27
Nerses

defaultはcallableを受け取るため、必要なことを行う関数を作成し、それを引数として提供するだけです。

def one_day_hence():
    return timezone.now() + timezone.timedelta(days=1)

class MyModel(models.Model):
    ...
    key_expires = models.DateTimeField(default=one_day_hence)

(説明したように ここ 、これをlambdaにする誘惑に抵抗してください。)

私はDjango 2.1.7、このバージョンではdefaultの関数を書く必要はありません。あなたは以前の単純な修正によってあなたを単に使用することができますコード:

key_expires = models.DateTimeField(default=timezone.now() + timezone.timedelta(days=1))

違いが()timezone.now

timedeltaの詳細については、 link を参照してください。

0
FaridLU