queryset onetomany one many foreign example create django django-models

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.