假设我有以下模型,其中“问题和选择”具有多对多关系,而“选择和选民”具有多对多关系。 (为更好地理解它,请考虑一个民意测验,其中每个问题可以有多个选择,并且每个选择都可以与多个问题相关联,并且每个选择都存储一个投票的人的列表,而选民可以为多个选择投票。)
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
相关联。
因此,如果选择c1
和c2
与问题ques1
相关联,而选民v1
和v2
则投票给选择c1
和选民v3
对选择c2
投了赞成票,然后对问题ques1
运行查询,我想要一个包含[v1, v2, v3]
的QuerySet。
对此有疑问吗?
当然,效率极低的解决方法是迭代ques1.choices
,并在每次迭代时更新所有投票者的运行列表。我想通过使用select_related
可以使其效率更高一些,但是在进行干净查询时并不是一个好地方。
答案 0 :(得分:0)
我们可以做到:
Voter.objects.filter(choice__in=ques1.choices.all()).distinct() # Used distinct() to get unique voters.
在Django's official documentation中了解有关此内容的更多信息。