Le relazioni molti a molti
Vogliamo aggiungere un'altra funzionalità alla nostra applicazione, vogliamo tracciare i docenti dei
nostri corsi. Per fare questo introdurremo un nuovo di campo, il ManyToManyField
. Questo campo serve
a nascondere la complessità della creazione di una relazione molti a molti, si tratta di una
interfaccia semplificata per inserire le occorrenze in una tabella associativa tra le due che vogliamo
mettere in relazione.
Modifichiamo il modello Corso
per aggiungere il campo docenti
:
from django.contrib.auth.models import User
...
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)
docenti = models.ManyToManyField(User)
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"
A differenza del campo ForeignKey
in questo caso non serve usare gli attributi null
, blank
e
on_delete
. L'attributo sul nostro modello infatti non implica un campo in questa tabella, è solo
l'interfaccia per la tabella associativa. Le cancellazioni di un oggetto associato ad un altro tramite
un campo ManyToManyField
cancellano anche l'associazione.
Dopo aver aggiornato il modello generiamo la migrazione, applichiamola e salviamo i progressi:
python3 manage.py makemigrations
python3 manage.py migrate
git add corsi
git commit -m "Aggiungiamo docenti a Corso"
git push origin main
Esercizi
Leggi la documentazione di ManyToManyField
.