我有一个普通的 Django 模型,它与 django 多态模型有 ForeignKey 关系。
让我们将PlainModel
具有content
ForeignKey 字段的第一个称为具有子类型和的多态Content
模型(简化示例)。Video
Audio
现在我想查询所有PlainModel
引用Video
.
问题是我找到的所有文档都是关于直接通过多态模型本身进行过滤的。所以在这个例子中类似于Content.objects.instance_of(Video)
. 但我需要PlainModel
's,所以它需要看起来像PlainModel.objects.filter(content__instance_of=Video)
. 我尝试了很多变体,但找不到任何有效的方法。
在他们使用的文档中Q(instance_of=ModelB)
,但这不适用于关系 as Q(content__instance_of=ModelB)
。它给出了一个错误,如“无法查询“x”:必须是“y”实例。即使有翻译调用,我猜是因为 PlainModel 不具备多态意识。
我有一个临时 hack,它polymorphic_ctype
使用常规的 django 过滤器直接在字段上过滤PlainModel.objects.filter(content__polymorphic_ctype_id=my_content_type_id)
,但这不处理子类。例如:ExtendedVideo
在查找时找不到Video
,因为它会有不同的 ContentType id。
我可以解决这个问题并保留允许的子类型列表或解析类型层次结构以获得更多过滤器的内容类型,但这似乎与 django-polymorphic 的功能重复。