Нет ничего плохого (imho) в том, что одно приложение зависит от другого. В конце концов, приложения - это просто операции на множестве моделей. вам просто нужно всегда знать, какое приложение зависит от какого приложения (я думаю, вы могли бы назвать это картой зависимостей).
Вы можете добиться слабой связи с фреймворком contenttypes. Это позволяет приложению быть по-настоящему портативным / подключаемым, но все же интегрированным с другими приложениями.
Я написал приложение для комментариев (да, я заново изобрел колесо), которое можно интегрировать в любое другое приложение, с несколькими строками в шаблоне страницы, где должны публиковаться комментарии (с использованием пользовательских тегов).
Скажем, вы хотите, чтобы "нить" модели была подключена к любой другой модели. Идея состоит в том, чтобы создать общий внешний ключ (см. Документацию по django) и написать небольшую функцию, которая принимает любой объект и возвращает соответствующий ему «поток» (или создает его при необходимости), а также пишет собственный тег шаблона, который использует эту функциональность, например, {% get_thread for arbitrary_object as thread %}
. Все сообщения связаны с темой, связанной с объектом, которая может быть любого типа.
Вы можете рассматривать объект «поток» как своего рода прокси-сервер, поэтому вместо того, чтобы сообщение относилось к определенной «статье» или «сообщению в блоге», оно просто связано с потоком, который является абстрактным в каком-то смысле, что является потоком? Это просто коллекция постов. Затем поток позволяет себе быть связанным с любым объектом независимо от его типа. (хотя он делает больше, он может содержать дополнительную информацию, такую как разрешение / запрещение одних сообщений, закрытие / открытие комментариев на странице и т. д.) *
EDIT
Вот как вы можете создать общий внешний ключ с помощью структуры типов контента:
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
class Thread( models.Model ):
object_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = generic.GenericForeignKey('object_type', 'object_id')
Вы можете сделать его более «прозрачным», используя неявный «общий» интерфейс, который django предполагает реализовать во всех объектах.
#inside the Thread class:
def __unicode__(self):
return unicode(self.object)
def get_absolute_url(self):
return self.object.get_absolute_url()