es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo manejar la relación circular en los modelos de Django?

Estoy tratando de escribir una base de datos básica para ofrecer mis fotografías. Parecía tan simple, pero simplemente no puedo entender esto, a pesar de haber estado pensando durante un par de semanas. Estoy tratando de combinar múltiples modelos que se vinculan entre sí.

Foto: Archivos con algunos datos almacenados
Persona: Datos sobre una persona que aparece en una foto / ha hecho una cita
Cita: Algo que una persona ha dicho y que necesita estar adjunto a las fotos (la cita no pertenece a todas las fotos de esa persona, sino a un conjunto específico)
Oferta: Una descripción general que tiene todas las citas con una foto como miniatura y todas las fotos (algunas fotos pueden tener la misma cita, pero solo debería aparecer una vez).

Como maqueta y porque a la gente le gusta ver algo de código primero hice esto:

class Cita:
    persona = models.ForeignKey("Persona")
    fotos = models.ManyToManyField("Foto")

class Persona:
    foto = models.ForeignKey("Foto")

class Foto:
    pass

class Oferta:
    citas = models.ManyToManyField("Cita")
    fotos = models.ManyToManyField("Foto")

Por favor, tome el código anterior como una ilustración, porque ya no sé cómo abordar esto. He intentado varias versiones diferentes, pero siempre hay algún caso que no se cubre. En el ejemplo anterior, el problema es: Persona y Cita están adjuntas independientemente a las Fotos. Pero no puede haber una Cita sin que esa Persona esté incluida. Entonces, la información se duplica y puede ser contradictoria. También intenté usar “through=” para unir Personas y Citas, pero luego surgieron otros problemas.

¿Puede recomendarme algún tutorial bueno o darme una pista de cómo lidiar con este tipo de relaciones “desordenadas”?

Gracias,
Michael

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Querido Michael,

    Entiendo que estás teniendo dificultades para construir una base de datos Django para ofrecer tus fotografías. Tu problema parece radicar en la vinculación de múltiples modelos juntos, específicamente en los casos donde la misma información aparece en más de un modelo.

    Te sugeriría considerar la creación de un modelo separado para vincular Persona y Cita, llamado algo como “PersonaCita” o “AtribuciónCita”. Este modelo tendría claves externas (foreign keys) tanto a Persona como a Cita, y también podría incluir cualquier otra información que puedas necesitar. Al hacer esto, evitas duplicar información y te aseguras de que siempre haya una Persona asociada a una Cita.

    Tus modelos actualizados podrían lucir algo así:

    class Persona(models.Model):
        # campos para los datos de la persona aquí
    
    class Cita(models.Model):
        # campos para los datos de la cita aquí
    
    class PersonaCita(models.Model):
        persona = models.ForeignKey(Persona)
        cita = models.ForeignKey(Cita)
    
    class Foto(models.Model):
        # campos para los datos de la foto aquí
        citas = models.ManyToManyField(Cita, through=PersonaCita)
    
    class Oferta(models.Model):
        # campos para los datos de la oferta aquí
        fotos = models.ManyToManyField(Foto, related_name="ofertas")
    

    Al agregar el modelo PersonaCita, ahora puedes vincular Persona y Cita de una manera que evita la duplicación y asegura que siempre haya una Persona asociada a una Cita. También puedes usar el parámetro “through” en tu modelo Foto para especificar que las citas deben ser vinculadas a través del modelo PersonaCita, e incluir cualquier campo adicional que puedas requerir.

    ¡Espero que esto te ayude! En cuanto a tutoriales, la documentación de Django es un gran lugar para comenzar si aún no la has consultado: https://docs.djangoproject.com/en/3.1/. ¡Buena suerte con tu proyecto!

    Mejores deseos,
    [Tu nombre]

Comments are closed.