django 特定子类的查询集(非抽象模型)

6tdlim6h  于 2023-02-05  发布在  Go
关注(0)|答案(2)|浏览(148)

我如何得到一个特定子类的查询集?看起来不像通过related_name就能得到答案。使用Django 3.2.6顺便说一句。
下面是我的设置:

class Quiz(models.Model):
    name = # char field

class Question(models.Model):
    # a quiz has many questions
    quiz = models.ForeignKey(Quiz, related_name = '%(class)s')
    # etc...

class TFQuestion(Question):
    is_true = models.BooleanField(...)

class MCQuestion(Question):
    n_choices = models.IntegerField(...)

我想要的是得到一个只是MC问题的查询集,并像这样处理它们。
我觉得有必要强调一下Question并不是抽象的。所以问题模型有它自己的related_name,但是指定的'%(class)s'模式似乎没有传播到子类。我看到的所有其他线程都建议使用这个模式,但是它只适用于抽象模型!在使用多表继承时不适用。
据我所知,我
不能
只是做:

quiz1 = Quiz.objects.get(id=1)

# this works; returns queryset of Question objects
allquestions = quiz1.question.all()

# doesn't work
all_mcqs = quiz1.mcquestion.all()
gk7wooem

gk7wooem1#

您可以使用以下命令**.filter(…)**[Django-doc]:

MCQuestion.objects.filter(quiz=quiz1)

为了继承一个具体的模型,Django会为QuestionTFQuestionMCQuestion创建三个表。MCQuestion会有一个“隐藏的”OneToOneFieldQuestion

rkue9o1l

rkue9o1l2#

自我回答(有点)

我见过一些变通方法,但比使用related_name更麻烦:
A.)使用的类名__为空:

quiz1 = Quiz.objects.get(id=1)

# get quiz1's MCQuestions as Questions
qs1 = quiz1.question.filter(mcquestion__isnull = False)
# returns: <QuerySet[<Question>,...]>
qs1.first().mcquestion.n_choices

B.)使用InheritanceManager和类名__为空:

from model_utils.managers import InheritanceManager

class Question(models.Model):
    # ...
    objects = InheritanceManager()

# django shell

quiz1 = Quiz.objects.get(id=1)

# get quiz1's MCQuestions as MCQuestions
qs1 = quiz1.question.select_subclasses().filter(mcquestion__isnull = False)
# returns: <InheritanceQuerySet[<Question>,...]>
qs1.first().n_choices

相关问题