'机器标签'在Django中引用模型实例

时间:2010-12-18 09:09:23

标签: django tagging database-design django-tagging

示例问题

说,您有模型PublicationPhotoEventPerson;他们可以通过不同的方式相互联系。特别是,出版物可以有1)一些插图(相关照片)和2)一些提到的角色。活动可以有一些照片和4)相关的人。此外,5)事件可以在出版物中提及。

除了插图之外,不需要将其他数据与关系相关联:他们需要一个位置字段进行排序。因此,在这种情况下(#1),可以使用Illustration之类的中间模型来引用照片和发布并指定位置字段。

但是对于案例2或4,它变得复杂。

指定一个ReferencedPerson是有意义的,它可以指向任何类型的对象(通过通用外键),因此它可以用于出版物和事件。另一方面,你可以指定ReferencedEvent,它可以在案例5和3中使用,但也可以在案例4中使用,因为你不能说它是一个引用一个人的事件而不是反之亦然。

所以,有一点它开始考虑简单地指定一个带有两个通用外键的ReferencedObject模型。这是不酷的,这是标签的用途,如果标签可以代表另一个模型实例,那就太棒了。

想法

机器标签是可包含名称空间和/或值的标签。它们看起来像namespace:tag=value(名称空间和值部分可选)。

机器标签不仅可用于保存额外数据,还可用于表示对象之间的关系。粗略的例子是Flickr,你可以用upcoming:event=81334标记照片,它会自动显示为即将到来的链接。

可能的实施变体

machinetags申请的django-tagging分支。它非常通用,标签不被视为引用对象。我想编写一个提供辅助函数的应用程序和一个模板标记或过滤器,它将替换“特殊”机器标签,例如,用引用对象的人类可读名称。

问题

(抱歉不止一个。)使用机器标签在这样的模型之间建立关系是否有意义?如果确实如此,那么使用Django实现这一点的最佳方法是什么? ?什么情况下使用中间模型更好?我在这里解决了错误的问题吗?

1 个答案:

答案 0 :(得分:1)

我认为使用标记不适合表示关系。当然,这完全取决于您要执行的查询类型。对于常规导航查询,应使用常规的n:m关系。现在预先知道信息结构时,应该使用标记。