00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.