Campi dei Modelli
I campi dei modelli definiscono il tipo di dato che ogni colonna della tabella del database puo contenere. Django offre una vasta gamma di campi predefiniti, ognuno con opzioni specifiche.
Campi di Testo
from django.db import models
class Profilo(models.Model):
# Stringa con lunghezza massima (obbligatorio specificare max_length)
nome = models.CharField(max_length=100)
# Testo lungo senza limite di lunghezza
biografia = models.TextField(blank=True)
# Email con validazione automatica
email = models.EmailField(max_length=254)
# URL con validazione
sito_web = models.URLField(blank=True)
# Slug per URL leggibili (lettere, numeri, trattini)
slug = models.SlugField(max_length=200, unique=True)
Campi Numerici
class Prodotto(models.Model):
# Numero intero
quantita = models.IntegerField(default=0)
# Intero positivo
visualizzazioni = models.PositiveIntegerField(default=0)
# Numero decimale a virgola mobile
peso = models.FloatField(null=True, blank=True)
# Numero decimale preciso (ideale per prezzi)
prezzo = models.DecimalField(max_digits=10, decimal_places=2)
# Intero grande
codice_fiscale_numerico = models.BigIntegerField(unique=True)
# Intero piccolo
valutazione = models.SmallIntegerField(default=0)
Campi Booleani
class Utente(models.Model):
# Booleano (True/False)
attivo = models.BooleanField(default=True)
# Booleano che ammette anche NULL
verificato = models.BooleanField(null=True, default=None)
Campi Data e Ora
class Evento(models.Model):
# Solo data
data_evento = models.DateField()
# Data e ora
inizio = models.DateTimeField()
# Solo ora
orario = models.TimeField()
# Durata temporale
durata = models.DurationField()
# Data di creazione automatica (impostata solo al momento della creazione)
creato_il = models.DateTimeField(auto_now_add=True)
# Data di aggiornamento automatica (aggiornata a ogni save)
aggiornato_il = models.DateTimeField(auto_now=True)
Campi File e Immagine
class Documento(models.Model):
# Upload di file generico
allegato = models.FileField(upload_to='documenti/%Y/%m/')
# Upload di immagini (richiede Pillow)
foto = models.ImageField(upload_to='foto/', blank=True)
Il parametro upload_to definisce la sottocartella allâinterno di MEDIA_ROOT dove verranno salvati i file.
Campi Speciali
import uuid
class Risorsa(models.Model):
# UUID come identificatore unico
uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
# Campo JSON per dati strutturati (Django 5.x, supportato su tutti i database)
metadati = models.JSONField(default=dict, blank=True)
# Indirizzo IP
ip_address = models.GenericIPAddressField(null=True, blank=True)
Opzioni Comuni dei Campi
Ogni campo accetta opzioni che ne configurano il comportamento:
class Articolo(models.Model):
# null=True: ammette NULL nel database
sottotitolo = models.CharField(max_length=200, null=True, blank=True)
# blank=True: ammette valore vuoto nei form
descrizione = models.TextField(blank=True)
# default: valore predefinito
pubblicato = models.BooleanField(default=False)
# unique=True: il valore deve essere unico nella tabella
slug = models.SlugField(unique=True)
# choices: limita i valori ammessi
STATO_CHOICES = [
('bozza', 'Bozza'),
('pubblicato', 'Pubblicato'),
('archiviato', 'Archiviato'),
]
stato = models.CharField(max_length=20, choices=STATO_CHOICES, default='bozza')
# help_text: testo di aiuto nei form
titolo = models.CharField(max_length=200, help_text='Inserisci il titolo.')
# verbose_name: etichetta leggibile
data_pub = models.DateField(verbose_name='Data di pubblicazione')
# db_index=True: crea un indice nel database
codice = models.CharField(max_length=50, db_index=True)
# editable=False: il campo non appare nei form
uuid = models.UUIDField(default=uuid.uuid4, editable=False)
# primary_key=True: usa questo campo come chiave primaria
codice_id = models.CharField(max_length=20, primary_key=True)
Choices con Enumerazioni (Django 5.x)
A partire da Django 3.0, puoi usare classi di enumerazione per le choices:
class Articolo(models.Model):
class Stato(models.TextChoices):
BOZZA = 'bozza', 'Bozza'
PUBBLICATO = 'pub', 'Pubblicato'
ARCHIVIATO = 'arch', 'Archiviato'
stato = models.CharField(
max_length=5,
choices=Stato.choices,
default=Stato.BOZZA,
)
# Utilizzo
articolo = Articolo.objects.get(pk=1)
if articolo.stato == Articolo.Stato.PUBBLICATO:
print('Articolo pubblicato')
Conclusione
Django offre un campo per ogni tipo di dato comune. Comprendere le opzioni disponibili come null, blank, default, unique e choices ti permette di definire modelli precisi e ben validati. Scegliere il campo giusto e le opzioni corrette e essenziale per la solidita del tuo schema dati.