使用 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 会检索所有问题选项,这不是我正在寻找的。

您可以使用question.questionchoice_set访问Question对象的QuestionChoicesquestion,因此:

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 样式指南,因为变量应该是蛇形的

最新更新