Проблемы кругового импорта с приложениями Django, которые зависят друг от друга - PullRequest
5 голосов
/ 10 марта 2010

Я пишу пару приложений django, которые по замыслу связаны между собой. Но у меня проблемы с импортом. Я знаю, что это может быть плохой дизайн, поэтому, пожалуйста, приведите примеры лучших решений, но я не могу найти более подходящий дизайн. Так что, если нет лучшего дизайна, как решить этот вопрос?

Это в основном два приложения django, с некоторыми моделями, которые связаны друг с другом в разных приложениях. Короче говоря, система - это система, основанная на событиях. Таким образом, есть модель события и модель задачи. Они живут в разных приложениях, событиях и задачах. Когда события запускаются, мне нужно проверить, что оставшиеся задачи решены или нет, и когда задача решена, это может вызвать некоторые другие события.

Таким образом, в событиях мне нужно хранить данные о задачах (чтобы проверить, решены ли эти задачи), а в задачах мне нужно хранить данные о событиях (которые запускаются при их решении)

Вот пример кода из моих приложений:

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."))
    ...

Это вызывает проблемы с импортом, когда я пытаюсь проверить:

AttributeError: 'module' object has no attribute 'Event'

Так как это решить? Я пытался использовать некоторые вспомогательные функции django в надежде, что это поможет, в частности, я пытался использовать функции django.db.models.get_app и get_model для импорта моделей вместо непосредственного их импорта, но я все еще получаю проблемы.

Конечно, я мог бы собрать их в одно и то же приложение, но я уверен, что они должны жить в разных приложениях, поскольку они обрабатывают отдельные вещи. Но да, они зависят друг от друга. Если я не могу решить проблемы с импортом, какие-нибудь идеи о том, как спроектировать это иначе?

Конечно, я мог бы использовать некоторые родовые отношения, но это на самом деле усложнило бы понимание для других людей, поскольку в нем не указан тип контента, к которому он должен относиться.

1 Ответ

7 голосов
/ 10 марта 2010

Обе модели не нуждаются в полях «многие ко многим».

Не ставьте обе стороны отношения «многие ко многим» в вашей модели.

Когда вы вводите одно отношение «многие ко многим», Джанго вставляет для вас другую сторону отношения .

http://docs.djangoproject.com/en/1.1/topics/db/queries/#many-to-many-relationships

Оба конца многих ко многим отношения получают автоматический доступ к API на другой конец. API работает просто как "отсталый" один ко многим отношения, выше.

«Когда запускаются события, мне нужно проверить, решены ли остальные задачи».

  • Это означает, что событие может быть инициировано другим способом и не зависит от какой-либо задачи.

  • Если событие может быть инициировано и приводит к выполнению задач, то задачи зависят от событий.

"когда задача решена, это может вызвать некоторые другие события"

  • Это означает, что задачи зависят от событий. События не зависят от задач.

Поместите ссылку «многие ко многим» на «События в задачах». Ничего не ставьте в событиях, так как события могут быть использованы в другом месте, чтобы вызвать цепочку задач и других событий. Некоторые клиентские приложения будут импортировать только события.

Кроме того, вы можете предоставить ссылки на поля «многие ко многим», используя имя строки вместо импорта модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...