在Django中查询ManyToMany关系

时间:2019-10-08 05:12:01

标签: python django django-queryset manytomanyfield

假设我有以下模型,其中“问题和选择”具有多对多关系,而“选择和选民”具有多对多关系。 (为更好地理解它,请考虑一个民意测验,其中每个问题可以有多个选择,并且每个选择都可以与多个问题相关联,并且每个选择都存储一个投票的人的列表,而选民可以为多个选择投票。)

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

给出一个Question对象ques1,我希望能够获得与该问题的选项相关的所有选民的列表,即我想要一个对一个或多个选项投票的所有选民的QuerySet。与问题对象ques1相关联。

因此,如果选择c1c2与问题ques1相关联,而选民v1v2则投票给选择c1和选民v3对选择c2投了赞成票,然后对问题ques1运行查询,我想要一个包含[v1, v2, v3]的QuerySet。

对此有疑问吗?

当然,效率极低的解决方法是迭代ques1.choices,并在每次迭代时更新所有投票者的运行列表。我想通过使用select_related可以使其效率更高一些,但是在进行干净查询时并不是一个好地方。

1 个答案:

答案 0 :(得分:0)

我们可以做到:

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

Django's official documentation中了解有关此内容的更多信息。

相关问题