Django — Cheat Sheet

Tag: django, python, backend, orm, mvt, web, api

Livello: intermedio

TL;DR: Web framework Python full-stack basato su architettura MVT, ORM integrato, migrazioni schema e pannello admin out-of-the-box.

Concetti chiave

Architettura MVT: Model definisce i dati, View gestisce la logica di business, Template si occupa della presentazione.

ORM integrato: mappa modelli Python in tabelle relazionali gestendo relazioni OneToOne, ForeignKey e ManyToMany.

QuerySet lazy: le query al database vengono eseguite solo al momento dell'iterazione o dell'accesso ai dati.

Migrazioni: makemigrations genera i file di migrazione, migrate applica le modifiche allo schema del database.

Django Admin: interfaccia CRUD automatica e configurabile generata direttamente dai modelli registrati.

Middleware: catena di hook che intercettano ed elaborano richieste HTTP in entrata e risposte in uscita.

Autenticazione integrata: modello User estendibile con AbstractUser o AbstractBaseUser, permessi e gruppi già configurati.

Sicurezza nativa: protezioni integrate contro CSRF, SQL Injection, XSS e Clickjacking.

Domande tipiche e risposte pronte

Q: Come risolvi il problema delle query N+1 nell'ORM di Django?R: Utilizzo select_related per relazioni a singolo oggetto con SQL JOIN, oppure prefetch_related per relazioni ManyToMany e reverse foreign key.

Q: Qual è la differenza principale tra select_related e prefetch_related?R: select_related effettua una JOIN SQL diretta a livello database, mentre prefetch_related esegue query separate e combina i risultati in Python.

Q: Quando conviene estendere AbstractUser rispetto ad AbstractBaseUser?R: Uso AbstractUser per mantenere i campi standard aggiungendo solo nuovi attributi; scelgo AbstractBaseUser per riscrivere interamente il modello di autenticazione.

Q: Come gestisci transazioni complesse che coinvolgono più scritture sul database?R: Utilizzo il context manager transaction.atomic() per garantire il rollback automatico in blocco in caso di eccezioni non gestite.

Insidie e errori comuni

Esecuzione non voluta di query nei cicli per mancato uso di select_related o prefetch_related.

Modifica manuale dei file di migrazione già applicati in produzione senza creare una nuova migrazione.

Uso improprio di null=True su campi di tipo CharField o TextField, causando ambiguità con stringa vuota.

Mancata invalidazione della cache quando i modelli sottostanti vengono aggiornati tramite metodi bulk.

Import circolari tra file models.py di diverse app; risolvibili indicando il modello come stringa nel campo.

Snippet e comandi

# Gestione migrazioni
python manage.py makemigrations
python manage.py migrate
python manage.py showmigrations

Python

# Ottimizzazione query ORM
from django.db import transaction
from myapp.models import Order

# Esempio select_related e transazione atomica
with transaction.atomic():
    orders = Order.objects.select_related("customer").filter(status="paid")
    for order in orders:
        print(order.customer.email)

Python

# Registrazione modello in admin
from django.contrib import admin
from .models import Order

@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = ("id", "customer", "created_at", "status")
    list_filter = ("status", "created_at")
    search_fields = ("customer__email", "id")

Da ripassare

[ ] Configurazione di database router per architetture multi-database

[ ] Segnali Django (post_save, pre_delete) e relativi impatti prestazionali

[x] Flusso standard di gestione URL e routing con urls.py

[x] Utilizzo base di F() ed Q() expression nelle query complesse

Jarvis Interviews
Jarvis