假设我有以下模型,其中问题和选择具有多对多的关系,选择和选民具有多对多的关系。 (为更好地理解它,请考虑一个民意测验,其中每个问题可以有多个选择,并且每个选择都可以与多个问题相关联,并且每个选择都存储一个投票的人的列表,而选民可以为多个选择投票。)
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
,我希望能够获得与该问题的选择相关的所有选民的列表,即我想要一个对与该投票相关的一个或多个选择进行投票的所有选民的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中了解更多信息。