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)
Se vuoi aggiornamenti su Development inserisci la tua email nel box qui sotto: