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

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,我希望能够获得与该问题的选择相关的所有选民的列表,即我想要一个对与该Question对象相关的一个或多个选择进行了投票的所有选民的QuerySet ques1

因此,如果将选项c1c2与问题ques1关联,并且选民v1v2对选项c1进行投票,选民v3对选项c2进行投票,则在以下位置运行查询问题ques1,我想要一个包含[v1, v2, v3]的QuerySet。

是否对此有任何疑问?

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

最佳答案

我们可以做的:

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


Django's official documentation中阅读有关它的更多信息。

10-08 00:37