3

我有一个普通的 Django 模型,它与 django 多态模型有 ForeignKey 关系。

让我们将PlainModel具有contentForeignKey 字段的第一个称为具有子类型和的多态Content模型(简化示例)。VideoAudio

现在我想查询所有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 的功能重复。

4

2 回答 2

0

您可以通过首先获取所有PlainModel具有Video子类型的实例,然后查询该查询集中的外键关系来做到这一点:

content_videos = Content.objects.instance_of(Video)
plain_model_videos = PlainModel.objects.filter(content__in=content_videos)

请参阅文档以供参考。

于 2016-10-12T15:48:36.127 回答
0

视频plain_models:

PlainModel.objects.filter(content__video__isnull=False)

其他plain_models,除了视频:

PlainModel.objects.filter(content__video__isnull=True)
于 2018-07-16T10:09:18.197 回答