我有 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 会检索所有问题选项,这不是我正在寻找的。
您可以使用question.questionchoice_set
访问Question
对象的QuestionChoice
squestion
,因此:
first_question = Question.objects.get(id=2)
correct_choices = first_question.questionchoice_set.filter(correct=True)
如果只有一个正确,则可以改用.get(…)
:
first_question = Question.objects.get(id=2)
correct_choice = first_question.questionchoice_set.get(correct=True)
如果您正在寻找Choice
对象,则可以通过以下方式访问它:
first_question = Question.objects.get(id=2)
correct_choices = first_question.choices.filter(questionchoice__correct=True)
.get()
返回一个对象实例(如果未找到,则引发错误(,而不是 QuerySet
由于您的错误清楚地表明您正在尝试过滤对象实例,这是不可能的,因此您应该改用filter()
filter(( 将始终为您提供一个 QuerySet,即使只有一个对象 匹配查询 - 在本例中,它将是一个包含 单元素。
如果您知道只有一个对象与您的查询匹配,则可以 在管理器上使用 get(( 方法,该方法直接返回对象
另请查看代码的 PEP 8 样式指南,因为变量应该是蛇形的