class Persona(models.Model):
#...
last_donate = models.DateTimeField()
can_donate_on = models.DateTimeField()
filtro sencillo, personas con fechas anteriores o iguales a «ahora (now)»
from django.utils import timezone
qs = Persona.objects.filter(can_donate_on__lte=timezone.now())
Filtrar operando valores del objeto
from datetime import timedelta
from django.db.models import F
qs = Persona.objects.annotate(can_donate_on=F("last_donate") + timedelta(day=56)).
filter(can_donate_on__lt=timezone.now())
otro ejemplo con conteos y operaciones (Banco de sangre; meta de bolsas; bolsas actuales; cuantas faltan)
qs = BloodBank.objects.annotate(
existent_amount=Count("blood_bag_set"),
remaining=F("goal")-F("existent_amount"),
).value_list("goal", "existent_amount", "remaining")
#1500 1000 500
Operar tipos distintos
from django.db.models import ExpressionWrapper, DateTimeField
qs = Event.objects.annotate(
ends_on=ExpressionWrapper(F("start_at")+F("duration"),
output_field=DateTimeField())
)
)
Extraído de
DjangoCon 2019 – Building effective Django queries with expressions by Vanessa Barreiros – YouTube