In questa lezione ci occupiamo di definire, mediante i modelli, i tre classici tipi di relazione tra entità del database: uno-a-molti, molti-a-molti e uno-a-uno.
Uno a molti
Per stabilire la relazione uno-a-molti tra le classi del modello, dobbiamo assegnare il tipo ForeignKey ad un attributo di una classe derivata da Model
. Il costruttore di ForeignKey
richiede di specificare la classe che rappresenta la tabella con cui stabilire la relazione.
Facciamo subito un esempio: alla classe Cellulare
vogliamo associare una sola Marca
e dire che una Marca
costruisce molti elementi Cellulare
. Vediamo come esprimere questa relazione:
class Cellulare(models.Model):
marca = models.ForeignKey(Marca)
modello = models.CharField(max_length=20)
class Marca(models.Model):
descrizione = models.CharField(max_length=30)
In questo modo è possibile anche definire relazioni ricorsive.
Molti a molti
Per definire relazioni molti-a-molti, dobbiamo utilizzare il tipo ManyToManyField, anche in questo caso specifichiamo la classe di riferimento. È sufficiente utilizzare il tipo ManyToManyField in solo una delle due classi "Model" coinvolte nella relazione.
Consideriamo ad esempio la relazione tra Cellulare
e ComponenteElettrico
: un cellulare contiene più componenti elettrici e un componente elettrico è presente in più cellulari.
class Cellulare(models.Model): componentiElettrici = models.ManyToManyField(ComponenteElettrico) class ComponenteElettrico(models.Model): matricola = models.CharField(max_length=12)
Anche mediante ManyToManyField
è possibile definire relazioni ricorsive.
Uno a uno
La definizione di relazioni uno-a-uno è molto semplice, il tipo da utilizzare è OneToOneField, e la modalità è analoga alle precendenti.
Relazioni tra applicazioni diverse
È possibile mettere in relazione un modello con un altro definito in un'altra applicazione. Per fare questo è necessario importare esplicitamente il modello, come nell'esempio seguente:
from miosito.altraapplicazione.models import altromodello
class MioModello(models.Model):
altromodello = models.ForeignKey(altromodello)