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.
