web-dev-qa-db-fra.com

Django default = timezone.now + delta

Essayer de définir un horodatage pour une expiration de clé dans Django modèle et heurté ce problème:

Mon code actuel:

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

Le code ci-dessus fonctionne, cependant, lorsque "timezone.now ()" est utilisé, il obtient l'horodatage au moment du redémarrage d'Apache, donc cela ne fonctionne pas. J'ai fait quelques recherches et trouvé la solution pour cette partie du problème, donc en remplaçant "timezone.now ()" par "timezone.now", j'obtiens l'horodatage actuel chaque fois que l'objet est créé, ce qui est parfait , le problème est partiellement résolu.

J'ai du mal à changer la date en utilisant le "timezone.timedelta (jours = 1)".

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

L'erreur que je reçois est:

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

TypeError: type (s) d'opérande non pris en charge pour +: 'fonction' et 'datetime.timedelta'

L'objectif est de définir l'horodatage 24 heures à l'avance.

Toute aide est grandement appréciée.

27
Nerses

default prend un appelable, il vous suffit donc d'écrire une fonction pour faire ce que vous voulez, puis de fournir cela comme argument:

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

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

(Comme indiqué ici , résistez à la tentation d'en faire un lambda.)

47

Je travaille sur Django 2.1.7, Dans cette version il n'est pas nécessaire d'écrire une fonction pour default. Vous pouvez simplement utiliser votre par simple modification de votre précédent code, qui est:

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

Si vous remarquez que la différence est () après timezone.now

Vous pouvez suivre le lien pour plus d'informations sur timedelta

0
FaridLU