foreign - onetomany django
Cómo expresar una relación de Uno a Muchos en Django (3)
Estoy definiendo mis modelos de Django en este momento y me di cuenta de que no había OneToManyField
en los tipos de campo del modelo. Estoy seguro de que hay una manera de hacerlo, así que no estoy seguro de lo que me estoy perdiendo. Básicamente tengo algo como esto:
class Dude(models.Model):
numbers = models.OneToManyField(''PhoneNumber'')
class PhoneNumber(models.Model):
number = models.CharField()
En este caso, cada Dude
puede tener varios PhoneNumber
, pero la relación debe ser unidireccional, ya que no necesito saber de PhoneNumber
que Dude
posee, per se, ya que podría tener muchos objetos diferentes que PhoneNumber
instancias de PhoneNumber
, como un Business
por ejemplo:
class Business(models.Model):
numbers = models.OneToManyField(''PhoneNumber'')
¿Con qué reemplazaría OneToManyField
(que no existe) en el modelo para representar este tipo de relación? Vengo de Hibernate / JPA donde declarar una relación de uno a muchos fue tan fácil como:
@OneToMany
private List<PhoneNumber> phoneNumbers;
¿Cómo puedo expresar esto en Django?
En Django, una relación de uno a muchos se llama ForeignKey. Sin embargo, solo funciona en una dirección, así que en lugar de tener un atributo number
de clase Dude
necesitarás
class Dude(models.Model):
...
class PhoneNumber(models.Model):
dude = models.ForeignKey(Dude)
Muchos modelos pueden tener un ForeignKey
para otro modelo, por lo que sería válido tener un segundo atributo de PhoneNumber
tal que
class Business(models.Model):
...
class Dude(models.Model):
...
class PhoneNumber(models.Model):
dude = models.ForeignKey(Dude)
business = models.ForeignKey(Business)
Puede acceder a PhoneNumber
s para un objeto Dude
d
con d.phonenumber_set.objects.all()
, y luego hacer lo mismo para un objeto Business
.
Para manejar las relaciones One-To-Many en Django, necesita usar ForeignKey
.
La documentación en ForeignKey es muy completa y debe responder todas las preguntas que tenga:
https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey
La estructura actual en su ejemplo permite que cada tipo tenga un número, y cada número pertenezca a varios tipos (lo mismo con los negocios).
Si desea la relación inversa, deberá agregar dos campos ForeignKey a su modelo PhoneNumber, uno a Dude y uno a Business. Esto permitiría que cada número pertenezca a un solo Amigo o un Negocio, y que los Tíos y las Empresas puedan poseer varios Números. Creo que esto podría ser lo que buscas.
class Business(models.Model):
...
class Dude(models.Model):
...
class PhoneNumber(models.Model):
dude = models.ForeignKey(Dude)
business = models.ForeignKey(Business)
Puede usar cualquier clave externa en muchos lados de la relación OneToMany
(es decir, la relación ManyToOne
) o usar ManyToMany
(en cualquier lado) con una restricción única.