Consultas Django «F objects»

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

Deja un comentario