Le relazioni uno a molti
Vogliamo estendere il nostro modello Corso
per poter classificare i corsi in categorie. Per fare
questo introdurremo un nuovo modello Categoria
collegato a Corso
da una chiave esterna.
Modifichiamo il nostro file models.py
così:
from django.db import models
class Categoria(models.Model):
titolo = models.CharField(max_length=100)
creato = models.DateTimeField(auto_now_add=True)
aggiornato = models.DateTimeField(auto_now=True)
def __str__(self):
return self.titolo
class Meta:
verbose_name_plural = "Categorie"
class Corso(models.Model):
titolo = models.CharField(max_length=100)
descrizione = models.TextField()
categoria = models.ForeignKey(Categoria, null=True, blank=True, on_delete=models.PROTECT)
creato = models.DateTimeField(auto_now_add=True)
aggiornato = models.DateTimeField(auto_now=True)
def __str__(self):
return self.titolo
class Meta:
verbose_name_plural = "Corsi"
Abbiamo aggiunto un nuovo modello Categoria
con il solo attributo titolo
usando gli stessi elementi
visti in precedenza. In Corso
invece abbiamo usato un nuovo tipo di campo ForeignKey
che serve a
definire una chiave esterna e tre nuovi parametri null
, blank
e on_delete
.
null
rende il campo nullable, ci serve perché potremmo avere delle istanza di Corso
già inserite
in database e quindi non fornendo un valore di default non potremmo applicare la migrazione.
blank
invece permette al campo di essere vuoto nell'interfaccia di amministrazione, vuoto può
assumere diversi significati: una relazione opzionale per le chiavi esterne ma anche del testo vuoto
per un campo testuale.
on_delete
infine specifica come vogliamo Django (e non il database!) tratti la cancellazione di un
oggetto referenziato. In questo caso come venga trattata la cancellazione di una Categoria
associata ad un Corso
. Abbiamo scelto di usare models.PROTECT
cioè di impedire la cancellazione di
una Categoria
se questa viene referenziata da un Corso
.
Creiamo ed applichiamo le migrazioni:
python3 manage.py makemigrations
python3 manage.py migrate
E quindi salviamo i progressi in git:
git add corsi
git commit -m "Aggiungiamo categorie ai corsi"
git push origin main
Esercizi
Leggi la documentazione di ForeignKey facendo attenzione alle varie opzioni di on_delete.