首页 > 解决方案 > 在 Django 中使用中间模型属性访问字段

问题描述

我有 3 个模型,其中一个是中间模型,如下所示:

class Choice(models.Model):
    choice_text = models.CharField(max_length=20)

class Question(models.Model):
    skip = models.BooleanField(default=True)
    choices = models.ManyToManyField(Choice, through='QuestionChoice')

class QuestionChoice(models.Model):
    choice = models.ForeignKey(Choice, on_delete=models.CASCADE)
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    correct = models.BooleanField(default=False)

我试图访问一个特定的问题,然后从中间模型中获得正确的选择。

First_question = Question.objects.filter(skip = True)
First_question.objects.filter(QuestionChoice__correct=True)

这是我得到的错误

Manager isn't accessible via Question instances

我已经读到我不能使用 First_question 来访问中间模型,但使用 Question 会检索所有不是我想要的问题选择。

标签: pythondjango

解决方案


.get()返回一个对象实例(如果未找到则引发错误)而不是QuerySet

由于您的错误清楚地表明您正在尝试过滤不可能的对象实例,因此您应该filter()改用

filter() 将始终为您提供一个 QuerySet,即使只有一个对象与查询匹配 - 在这种情况下,它将是一个包含单个元素的 QuerySet。

如果您知道只有一个对象与您的查询匹配,则可以在 Manager 上使用 get() 方法,该方法直接返回该对象


还可以查看代码的 PEP 8 样式指南,因为变量应该是蛇形


推荐阅读