«Машинные теги», ссылающиеся на экземпляры модели в Django - PullRequest
0 голосов
/ 18 декабря 2010

Пример задачи

Скажем, у вас есть модели 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?В каких случаях лучше использовать промежуточные модели?Я здесь решаю не ту проблему?

1 Ответ

1 голос
/ 18 декабря 2010

Я не думаю, что использование тегов подходит для представления отношений.Конечно, все зависит от того, какие запросы вы хотите выполнить.Для обычных навигационных запросов следует использовать обычные отношения n: m.Маркировка должна использоваться, когда информационная структура теперь известна заранее.

...