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.
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.
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.
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.
# 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")
[ ] 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