示例问题
比如说,你有模型Publication
, Photo
,Event
和Person
; 它们可以以不同的方式相互关联。特别是,出版物可以有 1)一些插图(相关照片)和 2)一些提到的角色。事件可以有一些 3) 照片和 4) 相关的人。此外,5) 事件可以在出版物中提及。
除了插图之外,不需要将其他数据与关系相关联:它们需要一个位置字段来进行排序。因此,在这种情况下(#1),可以使用中间模型,例如Illustration
引用照片和出版物并指定位置字段。
但是对于情况 2 或 4,情况会变得复杂。
指定可以指向任何类型的对象(通过通用外键)的 a 是有意义的ReferencedPerson
,因此它可以用于发布和事件。另一方面,您可以指定ReferencedEvent
,它可以用于案例 5 和 3,也可以用于案例 4,因为您不能真正说它是一个引用人的事件,反之亦然。
因此,在某一时刻,它变得不够干燥,以至于开始考虑简单地指定一个ReferencedObject
具有两个通用外键的模型。这很不酷,这就是标签的用途,如果标签可以代表另一个模型实例,那就太好了。
这个想法
机器标签是可以包含命名空间和/或值的标签。它们看起来像namespace:tag=value
(命名空间和值部分可选)。
机器标签不仅可以用来保存额外的数据,还可以用来表示对象之间的关系。粗略的例子是 Flickr,您可以在其中标记照片,例如,upcoming:event=81334
它将自动显示为即将到来的链接。
可能的实施变体
有应用machinetags
分支django-tagging
。它非常通用,并且标签不被视为引用对象。我想编写一个应用程序,提供帮助函数和一个模板标签或过滤器,它将“特殊”机器标签替换为引用对象的人类可读名称。
问题
(对不起,不止一个。)用机器标签在这样的模型之间建立关系是否有意义?如果是这样,用 Django 实现它的最佳方法是什么?什么情况下最好使用中间模型?我在这里解决了错误的问题吗?