Comment calculer la différence entre maintenant et un DateTimeField dans une vue Django ?

Published: 05 février 2021

Tags: Django;

DMCA.com Protection Status

Exemples de comment calculer la différence entre maintenant et un DateTimeField dans une vue Django:

"Confirmation email" vérification (Exemple 1)

Prenons par exemple le modèle suivant qui sera utilisé lorsqu'un nouvel utilisateur s'est inscrit à notre application et pour vérifier si l'email appartient à l'utilisateur ou non (models.py):

from datetime import datetime

class email_confirmation(models.Model):
    notebook = models.ForeignKey(Notebook, null=True, blank=True, default = None,on_delete=models.DO_NOTHING)
    secret_token = models.CharField(max_length=200,default='')
    date_created = models.DateTimeField(default=datetime.now)   
    removed = models.BooleanField(default=False)

L'objectif est de vérifier si la confirmation de vérification de l'email de l'utilisateur a été envoyée il y a moins de deux heures (c'est-à-dire il y a 120 minutes). Pour faire ça:

from datetime import timezone

email_confirmation_obj = email_confirmation.objects.filter(secret_token=token, removed=False)[0]
delta = datetime.datetime.now(timezone.utc) - email_confirmation_obj.date_created   
if (delta.seconds//60)%60  < 120:
    print('do something !')

Remarque: timezone.utc est utilisé pour éviter l'erreur:

can't subtract offset-naive and offset-aware datetimes

Vérifiez le nombre de nouvelles entrées (Exemple 2)

Un autre exemple d'utilisation d'un filtre pour vérifier le nombre de nouveaux articles créés par les utilisateurs au cours de la dernière heure (supposons que moins de 20 nouveaux articles créés en une heure semblent normaux mais plus peuvent être suspects)

models.py

class Article(models.Model):
    ...
    date_created = models.DateTimeField(default=datetime.now)   
    ...

views.py

time_threshold = datetime.datetime.now(timezone.utc) - datetime.timedelta(hours=1)
results = Article.objects.filter(date_created__gt=time_threshold)
if results.count() < 20:
    print('Looks ok  !')
else:
    print('somehting wrong !')

Références