Saltar al contenido

Cómo expresar una relación de uno a varios en Django

Solución:

Para manejar las relaciones de uno a varios en Django, debe usar ForeignKey.

La documentación de ForeignKey es muy completa y debería 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 que cada número pertenezca a varios tipos (lo mismo con Business).

Si desea la relación inversa, deberá agregar dos campos ForeignKey a su modelo PhoneNumber, uno para Dude y otro para Business. Esto permitiría que cada número pertenezca a un tipo o una empresa, y que los tipos 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)

En Django, una relación de uno a varios se llama ForeignKey. Sin embargo, solo funciona en una dirección, así que en lugar de tener un number atributo de clase Dude necesitará

class Dude(models.Model):
    ...

class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude)

Muchos modelos pueden tener un ForeignKey a 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 al PhoneNumbers para un Dude objeto d con d.phonenumber_set.objects.all(), y luego hacer lo mismo para un Business objeto.

Para ser más claros, no hay OneToMany en Django, solo ManyToOne, que es Foreignkey descrito anteriormente. Puede describir la relación OneToMany usando Foreignkey, pero eso es muy inexpresivo.

Un buen artículo al respecto: https://amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-relationship-in-django/

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *