Estoy escribiendo un par de aplicaciones django que, por diseño, están acopladas. Pero tengo problemas de importación serias. Sé que podría ser un mal diseño, así que proporcione ejemplos de mejores soluciones, pero no puedo encontrar un diseño más adecuado. Entonces, si no hay un mejor diseño, ¿cómo resolverlo?Problemas de importación circular con aplicaciones Django que tienen dependencias entre sí
Básicamente son dos aplicaciones django, con algunos modelos, que se relacionan entre sí a través de la aplicación. En resumen, el sistema es un sistema basado en eventos. Entonces hay un modelo de evento y un modelo de tarea. Estos viven en diferentes aplicaciones, eventos y tareas. Cuando se activan los eventos, necesito verificar que las tareas correspondientes estén resueltas o no, y cuando se resuelve una tarea, eso puede desencadenar algunos otros eventos.
Así que en eventos i necesidad de almacenar datos acerca de las tareas (para comprobar si se resuelven estas tareas) y en las tareas i necesidad de almacenar datos acerca de eventos (eventos wich para disparar cuando se resuelven)
Aquí está algo código de ejemplo de mis aplicaciones:
Events app
models.py
from tasks.models import Task
class Event(models.Model):
...
tasks = models.ManyToManyField(Task, help_text=_("Tasks we need to check if are solved before triggering this event."))
...
Tasks app
models.py
from events.models import Event
class Task(models.Model):
...
events = models.ManyToManyField(Event, help_text=_("Events to trigger when this task i solved."))
...
esto está causando problemas de importación cuando intento para validar:
AttributeError: 'module' object has no attribute 'Event'
Entonces, ¿cómo resolver esto? He intentado utilizar algunas de las funciones de ayuda de django con la esperanza de que eso ayude, más específicamente intenté usar las funciones django.db.models.get_app y get_model para importar los modelos en lugar de importarlos directamente, pero sigo recibiendo problemas.
Por supuesto que podría recopilarlos en la misma aplicación, pero claramente creo que deberían vivir en aplicaciones separadas, ya que manejan cosas separadas. Pero sí, ellos son dependientes el uno del otro. Si no puedo resolver los problemas de importación, ¿alguna idea sobre cómo diseñar esto es diferente?
Por supuesto, podría utilizar algunas relaciones genéricas, pero eso realmente haría las cosas más difíciles de entender para otras personas, ya que no especifica el tipo de contenido con el que debería estar relacionado.
¿Seguro acerca de esto? No son las mismas tareas y eventos. Una tarea puede desencadenar ciertos eventos, pero no los mismos que podrían verificar si esa tarea está resuelta. ¿Se puede utilizar el nombre de la cadena para importar el modelo si no está en la misma aplicación? – espenhogbakk
http://docs.djangoproject.com/en/dev/ref/models/fields/#lazy-relationships dice que es posible usar relaciones perezosas entre aplicaciones, así que lo probaré. – espenhogbakk
@Espen Christensen: debe romper la circularidad de alguna manera. No puede tener muchos de muchos en * ambos * lugares, debe estar en un solo lugar. Elegir uno. Actualicé la pregunta para explicar por qué escogí la que elegí. Puede elegir Tarea en lugar de Evento, pero debe elegir exactamente una y solo una. No puedes tener una relación de muchos a muchos en ambos lugares. –