You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 3.2.6非抽象模型下如何获取特定子类的Queryset?

解决Django多表继承下获取子类QuerySet的问题

针对你用Django3.2.6遇到的多表继承场景,想要从Quiz实例获取特定子类MCQuestion的QuerySet,这里给你几个可行的方案:

方案1:直接查询子类并过滤关联的Quiz

因为多表继承中,子类MCQuestion和父类Question是通过一对一关联的,你可以直接从MCQuestion出发,过滤关联到目标Quiz的实例:

quiz1 = Quiz.objects.get(id=1)
all_mcqs = MCQuestion.objects.filter(quiz=quiz1)

Django会自动处理跨表关联,帮你找到所有属于该Quiz的MCQuestion实例。

方案2:从Quiz的Question集合中筛选子类实例

如果你想从已有的Quiz实例的question集合出发,可以用Django的InstanceOf查询来筛选出MCQuestion类型的对象:

from django.db.models import InstanceOf

quiz1 = Quiz.objects.get(id=1)
all_mcqs = quiz1.question.all().filter(InstanceOf(MCQuestion))

这样得到的QuerySet里的对象都是MCQuestion的实例,可以直接调用子类的属性(比如n_choices)。

为什么之前的quiz1.mcquestion.all()不生效?

你提到的%(class)s这个related_name模式只对抽象基类有效,在多表继承场景下,父类Question的related_name不会被子类MCQuestion继承并替换,所以Quiz实例不会自动生成mcquestion这个反向关联属性。多表继承中,子类和Quiz之间没有直接的外键关联,必须通过父类Question来间接关联。

内容的提问来源于stack exchange,提问作者rpf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:05:17