Rappresenta una relazione uno a molti in Django
- Rappresentare una relazione uno a molti utilizzando un modello di giunzione/intermediario
- Rappresentare relazioni uno a molti utilizzando chiavi esterne
I database svolgono un ruolo chiave quasi ovunque e non sorprende che lo sviluppo web sia uno di questi posti. Costruire tabelle e impostare relazioni tra tabelle utilizzando SQL è un compito semplice, ma Django lo rende ancora più semplice.
Questo articolo introdurrà come rappresentare una a molte relazioni in Django.
Rappresentare una relazione uno a molti utilizzando un modello di giunzione/intermediario
Fare riferimento alle definizioni dei seguenti modelli.
class Number(models.Model):
number = models.CharField(max_length=10)
class Person(models.Model):
name = models.CharField(max_length=200)
class PersonNumber(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="numbers")
number = models.ForeignKey(Number, on_delete=models.CASCADE, related_name="person")
Il modello Number
dispone di un campo number
per memorizzare un numero di telefono.
Il modello Person
ha un campo name
per il nome della persona.
PersonNumber
è un modello di giunzione o intermediario per “Numero” e “Persona”. Le chiavi esterne hanno una relazione a cascata con gli oggetti a cui si fa riferimento. Questo modello può essere utilizzato per impostare una relazione uno-a-molti e una relazione molti-a-molti.
La chiave primaria predefinita per tutti i modelli è id
, un campo automatico intero.
Poiché un numero di telefono è associato solo a una singola persona, ma una persona può avere più di un numero di telefono, si tratta di una relazione uno a molti. PersonNumber
sarà usato per rappresentare questa relazione.
Se una variabile person
sta memorizzando un oggetto Person
, possiamo facilmente accedere a tutti i numeri di telefono di questa persona utilizzando la seguente istruzione.
numbers = person.numbers.objects.all()
Questa istruzione restituirà un QuerySet
di oggetti Number
.
Considera questo esempio.
ID | Person | Number |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 1 | 4 |
5 | 2 | 5 |
6 | 2 | 6 |
7 | 3 | 7 |
Una persona con id
1
ha quattro numeri di telefono con id
1
, 2
, 3
e 4
.
Una persona con id
2
ha due numeri di telefono con id
5
e 6
.
Una persona con id
3
ha un solo numero di telefono con id
7
.
Rappresentare relazioni uno a molti utilizzando chiavi esterne
Fare riferimento alle definizioni dei seguenti modelli.
class Person(models.Model):
name = models.CharField(max_length=200)
class Number(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
number = models.CharField(max_length=10)
Il modello Person
ha un campo name
per il nome della persona.
Il modello Number
ha un campo number
per memorizzare un numero di telefono e un riferimento di chiave esterna al modello Person
. Questo campo memorizzerà il proprietario di questo numero. La chiave esterna ha una relazione a cascata con il modello di riferimento, Person
.
Usando questa struttura, possiamo facilmente associare ogni oggetto Number
al suo rispettivo proprietario usando il riferimento della chiave esterna.
Se una variabile person
sta memorizzando un oggetto Person
, possiamo accedere a tutti i numeri associati a questa persona utilizzando la seguente istruzione.
numbers = Number.objects.filter(person=person)
Questa istruzione restituirà un QuerySet
di oggetti Number
.