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