Пример задачи
Скажем, у вас есть модели Publication
, Photo
, Event
и Person
;они могут относиться друг к другу по-разному.В частности, публикации могут иметь 1) некоторые иллюстрации (связанные фотографии) и 2) некоторые упомянутые персоны.События могут иметь 3) фотографии и 4) людей, связанных также.Кроме того, 5) события могут упоминаться в публикациях.
Никаких дополнительных данных не нужно связывать со связями, кроме иллюстраций: им нужно поле позиции для сортировки.Так что в этом случае (# 1) можно использовать промежуточную модель, такую как Illustration
, ссылающуюся на фотографию и публикацию и указывающую поле позиции.
Но в случаях 2 или 4 это усложняется.
Имеет смысл указать, скажем, ReferencedPerson
, который может указывать на объект любого типа (через общий внешний ключ), чтобы его можно было использовать как для публикаций, так и для событий.С другой стороны, вы можете указать ReferencedEvent
, который может использоваться в случаях 5 и 3, но также и в случае 4, потому что вы не можете сказать, что это событие, которое ссылается на человека, а не нанаоборот.
Таким образом, в какой-то момент становится достаточно СУХОЙ, чтобы начать думать о простом указании модели ReferencedObject
с двумя общими внешними ключами.И это не круто, для этого и нужны теги, и если бы теги могли представлять другие экземпляры модели, это было бы здорово.
Идея
Машинные теги являются тегамикоторый может содержать пространства имен и / или значения.Они выглядят как namespace:tag=value
(с необязательным пространством имен и значениями).
Машинные теги могут использоваться не только для хранения дополнительных данных, но и для представления отношений между объектами.Примером может служить Flickr, где вы можете пометить фотографию, скажем, upcoming:event=81334
, и она будет автоматически отображаться в виде ссылки на Upcoming.
Возможные варианты реализации
Есть machinetags
ветка django-tagging
приложения.Он довольно общий, и теги там не считаются ссылочными объектами.Я думаю о том, чтобы написать приложение, предоставляющее вспомогательные функции и шаблонный тег или фильтр, который заменил бы «специальный» машинный тег, скажем, на удобочитаемое имя объекта ссылки.
Вопрос
(Извините забольше, чем один.) Имеет ли смысл строить отношения между такими моделями с машинными тегами? И если это произойдет, что будет лучшим способом реализовать это с помощью Django?В каких случаях лучше использовать промежуточные модели?Я здесь решаю не ту проблему?