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

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.