0

示例问题

比如说,你有模型Publication, Photo,EventPerson; 它们可以以不同的方式相互关联。特别是,出版物可以有 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 实现它的最佳方法是什么?什么情况下最好使用中间模型?我在这里解决了错误的问题吗?

4

1 回答 1

1

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

于 2010-12-18T12:53:21.020 回答