QuerySet e ORM
LâORM (Object-Relational Mapping) di Django permette di interagire con il database usando codice Python invece di scrivere SQL. Il cuore dellâORM e il QuerySet, un oggetto che rappresenta una collezione di query al database.
Recuperare Tutti gli Oggetti
Il metodo all() restituisce un QuerySet con tutti i record della tabella:
from blog.models import Articolo
# Tutti gli articoli
articoli = Articolo.objects.all()
Filtrare i Risultati
Il metodo filter() restituisce gli oggetti che corrispondono ai criteri specificati:
# Articoli pubblicati
pubblicati = Articolo.objects.filter(pubblicato=True)
# Articoli di un autore specifico pubblicati nel 2026
risultati = Articolo.objects.filter(
autore='Mario',
data_pubblicazione__year=2026,
)
Escludere Risultati
Il metodo exclude() e lâopposto di filter():
# Tutti gli articoli tranne le bozze
non_bozze = Articolo.objects.exclude(stato='bozza')
Recuperare un Singolo Oggetto
Il metodo get() restituisce un singolo oggetto. Solleva unâeccezione se non trova risultati o ne trova piu di uno:
# Recupera un articolo specifico
articolo = Articolo.objects.get(pk=1)
# Gestire le eccezioni
try:
articolo = Articolo.objects.get(slug='django-tutorial')
except Articolo.DoesNotExist:
print('Articolo non trovato')
except Articolo.MultipleObjectsReturned:
print('Trovati piu articoli con lo stesso slug')
Creare Oggetti
# Metodo 1: create() - crea e salva in un solo passo
articolo = Articolo.objects.create(
titolo='Nuovo Articolo',
contenuto='Contenuto del nuovo articolo.',
pubblicato=True,
)
# Metodo 2: istanziare e salvare separatamente
articolo = Articolo(titolo='Altro Articolo')
articolo.contenuto = 'Contenuto...'
articolo.save()
# get_or_create() - recupera o crea se non esiste
articolo, creato = Articolo.objects.get_or_create(
slug='primo-articolo',
defaults={'titolo': 'Primo Articolo', 'contenuto': 'Testo...'},
)
Aggiornare Oggetti
# Aggiornare un singolo oggetto
articolo = Articolo.objects.get(pk=1)
articolo.titolo = 'Titolo Aggiornato'
articolo.save()
# Aggiornamento massivo con update()
Articolo.objects.filter(pubblicato=False).update(stato='bozza')
# update_or_create()
articolo, creato = Articolo.objects.update_or_create(
slug='primo-articolo',
defaults={'titolo': 'Titolo Aggiornato'},
)
Eliminare Oggetti
# Eliminare un singolo oggetto
articolo = Articolo.objects.get(pk=1)
articolo.delete()
# Eliminazione massiva
Articolo.objects.filter(stato='archiviato').delete()
Ordinamento
# Ordine crescente
articoli = Articolo.objects.order_by('titolo')
# Ordine decrescente
articoli = Articolo.objects.order_by('-data_pubblicazione')
# Ordinamento multiplo
articoli = Articolo.objects.order_by('-pubblicato', 'titolo')
Valori e Proiezioni
# Dizionari con solo alcuni campi
titoli = Articolo.objects.values('titolo', 'autore')
# [{'titolo': 'Articolo 1', 'autore': 'Mario'}, ...]
# Tuple con solo alcuni campi
titoli = Articolo.objects.values_list('titolo', flat=True)
# ['Articolo 1', 'Articolo 2', ...]
Metodi di Aggregazione e Utilita
# Conteggio
totale = Articolo.objects.count()
pub = Articolo.objects.filter(pubblicato=True).count()
# Verifica esistenza
esiste = Articolo.objects.filter(slug='tutorial').exists()
# Primo e ultimo elemento
primo = Articolo.objects.order_by('data_pubblicazione').first()
ultimo = Articolo.objects.order_by('data_pubblicazione').last()
# Valori distinti
autori = Articolo.objects.values_list('autore', flat=True).distinct()
Lazy Evaluation e Chaining
I QuerySet sono lazy: non eseguono query al database finche non vengono valutati. Puoi concatenare piu metodi senza penalita:
# Nessuna query viene eseguita fino alla valutazione
qs = Articolo.objects.filter(pubblicato=True)
qs = qs.exclude(stato='archiviato')
qs = qs.order_by('-data_pubblicazione')
qs = qs[:10]
# La query viene eseguita solo qui
for articolo in qs:
print(articolo.titolo)
Conclusione
I QuerySet di Django offrono unâinterfaccia Python potente e intuitiva per interagire con il database. Grazie alla lazy evaluation e al chaining, puoi costruire query complesse in modo efficiente. Padroneggiare metodi come filter(), exclude(), get(), create(), update() e delete() e fondamentale per ogni sviluppatore Django.