Filtri e Lookup
I lookup di Django sono suffissi speciali che si aggiungono ai nomi dei campi nelle query per specificare il tipo di confronto. Insieme agli oggetti Q e alle espressioni F, permettono di costruire query complesse e potenti.
Lookup di Uguaglianza
from blog.models import Articolo
# __exact: corrispondenza esatta (implicito)
Articolo.objects.filter(titolo__exact='Django Tutorial')
Articolo.objects.filter(titolo='Django Tutorial') # equivalente
# __iexact: corrispondenza esatta case-insensitive
Articolo.objects.filter(titolo__iexact='django tutorial')
Lookup di Contenimento
# __contains: contiene la stringa (case-sensitive)
Articolo.objects.filter(titolo__contains='Django')
# __icontains: contiene la stringa (case-insensitive)
Articolo.objects.filter(titolo__icontains='django')
# __startswith / __istartswith
Articolo.objects.filter(titolo__startswith='Guida')
Articolo.objects.filter(titolo__istartswith='guida')
# __endswith / __iendswith
Articolo.objects.filter(titolo__endswith='completa')
Lookup di Confronto Numerico
# __gt: maggiore di
Articolo.objects.filter(visualizzazioni__gt=100)
# __gte: maggiore o uguale a
Articolo.objects.filter(visualizzazioni__gte=100)
# __lt: minore di
Articolo.objects.filter(visualizzazioni__lt=50)
# __lte: minore o uguale a
Articolo.objects.filter(visualizzazioni__lte=50)
# __range: valore compreso in un intervallo (inclusi gli estremi)
Articolo.objects.filter(visualizzazioni__range=(10, 100))
Lookup di Appartenenza
# __in: valore presente in una lista
stati_validi = ['pubblicato', 'in_revisione']
Articolo.objects.filter(stato__in=stati_validi)
# Funziona anche con QuerySet annidati
autori_attivi = Autore.objects.filter(attivo=True).values_list('pk', flat=True)
Articolo.objects.filter(autore_id__in=autori_attivi)
Lookup su Date
from datetime import date
# __date: confronto sulla data di un DateTimeField
Articolo.objects.filter(data_pubblicazione__date=date(2026, 2, 6))
# __year, __month, __day
Articolo.objects.filter(data_pubblicazione__year=2026)
Articolo.objects.filter(data_pubblicazione__month=2)
Articolo.objects.filter(data_pubblicazione__day=6)
# __week_day (1=domenica, 7=sabato)
Articolo.objects.filter(data_pubblicazione__week_day=2) # lunedi
Lookup su Valori Nulli
# __isnull: verifica se il valore e NULL
Articolo.objects.filter(immagine__isnull=True) # senza immagine
Articolo.objects.filter(immagine__isnull=False) # con immagine
Oggetti Q per Query Complesse
Gli oggetti Q permettono di combinare condizioni con operatori logici OR (|), AND (&) e NOT (~):
from django.db.models import Q
# OR: articoli di Mario OPPURE pubblicati
Articolo.objects.filter(
Q(autore='Mario') | Q(pubblicato=True)
)
# AND esplicito
Articolo.objects.filter(
Q(autore='Mario') & Q(pubblicato=True)
)
# NOT: articoli che NON sono bozze
Articolo.objects.filter(~Q(stato='bozza'))
# Combinazioni complesse
Articolo.objects.filter(
Q(pubblicato=True) & (Q(autore='Mario') | Q(autore='Luigi'))
)
# Mescolare Q con argomenti keyword
Articolo.objects.filter(
Q(titolo__icontains='django') | Q(titolo__icontains='python'),
pubblicato=True, # gli argomenti keyword vengono combinati con AND
)
Espressioni F
Le espressioni F permettono di riferirsi ai valori dei campi del database allâinterno delle query, evitando di caricare i dati in Python:
from django.db.models import F
# Confrontare due campi dello stesso modello
Articolo.objects.filter(commenti__gt=F('visualizzazioni'))
# Operazioni aritmetiche
Articolo.objects.filter(commenti__gt=F('visualizzazioni') * 0.1)
# Aggiornamento basato sul valore corrente
Articolo.objects.filter(pk=1).update(visualizzazioni=F('visualizzazioni') + 1)
Le espressioni F sono efficienti perche lâoperazione viene eseguita interamente nel database, senza trasferire dati al server Python.
Lookup su Relazioni
Puoi attraversare le relazioni usando il doppio underscore:
# Filtrare in base a un campo di un modello correlato
Articolo.objects.filter(autore__nome='Mario')
Articolo.objects.filter(categoria__nome__icontains='python')
Articolo.objects.filter(commenti__testo__contains='ottimo')
Conclusione
I lookup, gli oggetti Q e le espressioni F sono strumenti fondamentali per scrivere query precise e performanti in Django. Con i lookup filtri i dati in modo granulare, con Q costruisci condizioni logiche complesse, e con F esegui operazioni direttamente nel database. Insieme, coprono praticamente ogni esigenza di interrogazione dati.