在 Django 中查询多对多关系

Querying ManyToMany Relationship in Django

假设我有以下模型,其中 Questions 和 Choices 是多对多关系,Choices 和 Voters 是多对多关系。 (为了更好地理解它,考虑一个民意调查,其中每个问题可以有多个选择并且每个选择可以与多个问题相关联,并且每个选择存储一个投票给它的人的列表,并且选民可以投票给多个选择。)

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    choices = models.ManyToManyField('Choice')

class Choice(models.Model):
    choice_text = models.CharField(max_length=200)
    voters = models.ManyToManyField('Voter')

    def __str__(self):
        return self.choice_text

class Voter(models.Model):
    name = models.CharField(max_length=500, default='FNU')

    def __str__(self):
        return self.name

给定一个问题对象 ques1,我希望能够获得与该问题的选项关联的所有选民的列表,即我想要一个查询集,其中包含投票给一个或多个选项的所有选民与 Question 对象关联的 Choices ques1

因此,如果选项 c1c2 与问题 ques1 关联,并且选民 v1v2 投票给选项 c1选民 v3 投票给选择 c2,然后 运行 关于问题 ques1 的查询,我想要一个包含 [v1, v2, v3].

的查询集

有这方面的问题吗?

效率极低的解决方法当然是遍历 ques1.choices,并在每次迭代时更新所有选民的 运行 列表。我想通过使用 select_related 可以稍微提高效率,但不是一个干净的查询点。

我们可以做到:

Voter.objects.filter(choice__in=ques1.choices.all()).distinct()    # Used distinct() to get unique voters.

Django's official documentation 中阅读更多相关信息。