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
相关产品推荐
相关产品推荐

