django ForeignKey 到任何类型的模型

Posted

技术标签:

【中文标题】django ForeignKey 到任何类型的模型【英文标题】:django ForeignKey to any type of model 【发布时间】:2011-08-21 08:26:15 【问题描述】:

所以我有一个模型,评论。在其中,它必须保留对它所评论的任何内容的引用。 它可以是对博客文章的回复,可以是对另一条评论的回复,等等。

那么我该如何存储这种关系呢?通常,我只会使用 ForeignKey 存储信息。但是 ForeignKey 要求它知道它所引用的模型的类型。

有没有像 ForeignKey 这样的 Django 内置的东西可以引用任何类型的模型?如果没有,实现这种关系的最佳方式是什么?

这是我的想法:

我可以使用一个整数来存储它正在响应的对象的 id,然后使用一个 CharField 来存储类型,然后我会通过执行类似 globals()[type_name].objects.get(id=id) 的操作来获取该对象,但我想我会有一些如果我使用这种方法需要做任何复杂的事情,比如搜索,那么问题来了。

或者,我可以为每个可以响应的对象创建一个不同的 Comment 类(当然是自动的)。但同样,这会导致限制。我不能再轻易地做Comment.objects.get(id=5)之类的事情了

或者我可以让我的评论类对它可能响应的每个可能的事物都有一个 ForeignKey,除了 1 之外的所有评论都为空。似乎仍然是一个低于标准的解决方案。

建议?

【问题讨论】:

【参考方案1】:

查看内置contenttypes 框架中的GenericForeignKey。

【讨论】:

它在页面上说我不能轻易地将objects.filter 与 GenericForeignKey 一起使用。如果我有一个对象,我想得到所有的 cmets 来响应它,我该怎么做? 向下滚动一点,查看GenericRelation 类。 docs.djangoproject.com/en/dev/ref/contrib/contenttypes/…【参考方案2】:

你想要 Django 的generic relations。

【讨论】:

以上是关于django ForeignKey 到任何类型的模型的主要内容,如果未能解决你的问题,请参考以下文章

任何人都可以仅使用 ForeignKey 在两个 django 模型之间建立多对多关系吗?

Django ForeignKey 字段类型

模型字段类型从 CharField 更改为 ForeignKey 时 Django 模板损坏

Django 使用 ForeignKey 形成单元测试

您如何使用任何 Boost 多精度库类型找到两个非常大的数的模逆? (cpp_int、gmp_int 等)

在 django 中删除 ForeignKey 时在相关模型上发出信号