假设我具有以下模型,其中“问题和选择”具有多对多关系,而“选择和选民”具有多对多关系。 (为更好地理解它,请考虑一个民意测验,其中每个问题可以有多个选择,并且每个选择可以与多个问题相关联,并且每个选择都存储一个投票的人的列表,而选民可以对多个选择投票。)
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
。因此,如果将选项
c1
和c2
与问题ques1
关联,并且选民v1
和v2
对选项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中阅读有关它的更多信息。