Как избежать циклических зависимостей в приложениях Django - PullRequest
3 голосов
/ 23 января 2011

Работая над моими проектами на основе Django, я всегда стараюсь следовать подходу Django к повторно используемым приложениям - я пытаюсь отделить свои приложения друг от друга и особенно стараюсь избегать перекрестных ссылок, но иногда это не кажется возможно.

Давайте рассмотрим простой пример с 2 приложениями: статьи и пользователи. Приложение «Статьи» определяет модель статьи, представление списка статей и отдельное представление статьи, приложение «Пользователи» определяет модель пользователя и представление профиля пользователя. Статья ссылается на пользователя из поля автора, поэтому приложение статей явно зависит от приложения пользователя, что нормально.

Но когда дело доходит до профиля пользователя, я хочу отображать последние статьи, созданные пользователем (и, может быть, последние статьи, просмотренные пользователем) на этой странице, но это делает приложение пользователя осведомленным о приложении статей, которое я пытаясь избежать.

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

Что вы, ребята, делаете в таких случаях?

Ответы [ 3 ]

9 голосов
/ 23 января 2011

Если вы действительно настроены на отсутствие диалога между приложением «пользователь» и приложением «статья», то вам нужно третье приложение, которое будет действовать как интерфейс.Это будет знать о пользователях и статьях и определить все связи между ними.Ваше представление статьи будет там, так как оно должно получить данные пользователя, и ваше представление профиля пользователя будет там, потому что оно должно сказать «Фред написал 5 статей».

Является ли этот уровень развязкистоит того, я не знаю.Иногда программирование для повторного использования мешает сделать его пригодным для использования в первую очередь.

1 голос
/ 24 января 2011

Стандартный (или предпочтительный) способ отсоединения связанных приложений заключается в добавлении условной связи - как в некоторых приложениях, которые пытаются импортировать django-уведомление, и только если они находят его, они сообщают ему о событиях.

Тем не менее, если у вас есть два приложения, которые по дизайну общаются друг с другом, то я не вижу смысла их разъединять - в мире Django есть множество примеров приложений, которым просто нужны другие приложения. Обратите внимание, что я говорю здесь о написании реального программного обеспечения, а не о каких-то академических обсуждениях: -)

0 голосов
/ 25 июня 2011

Кажется, что в этом случае зависимость пользователей от статей находится в методе, а не в поле. (Будь то метод модели, метод класса модели или метод менеджера не имеет значения). Если это так, вы можете выполнить ленивый импорт статей внутри метода. К тому времени, когда этот импорт будет выполнен, users.models будет полностью загружен, поэтому, даже если это циклический импорт, это не вызовет проблем. Оператору «import users» в статьях не нужно будет перезагружать пользователей, и будет доступно полное пространство имен пользователей.

...