在 Django 中查询多对多关系
Querying ManyToMany Relationship in Django
假设我有以下模型,其中 Questions 和 Choices 是多对多关系,Choices 和 Voters 是多对多关系。 (为了更好地理解它,考虑一个民意调查,其中每个问题可以有多个选择并且每个选择可以与多个问题相关联,并且每个选择存储一个投票给它的人的列表,并且选民可以投票给多个选择。)
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
,我希望能够获得与该问题的选项关联的所有选民的列表,即我想要一个查询集,其中包含投票给一个或多个选项的所有选民与 Question 对象关联的 Choices ques1
。
因此,如果选项 c1
和 c2
与问题 ques1
关联,并且选民 v1
和 v2
投票给选项 c1
选民 v3
投票给选择 c2
,然后 运行 关于问题 ques1
的查询,我想要一个包含 [v1, v2, v3]
.
的查询集
有这方面的问题吗?
效率极低的解决方法当然是遍历 ques1.choices
,并在每次迭代时更新所有选民的 运行 列表。我想通过使用 select_related
可以稍微提高效率,但不是一个干净的查询点。
我们可以做到:
Voter.objects.filter(choice__in=ques1.choices.all()).distinct() # Used distinct() to get unique voters.
在 Django's official documentation 中阅读更多相关信息。
假设我有以下模型,其中 Questions 和 Choices 是多对多关系,Choices 和 Voters 是多对多关系。 (为了更好地理解它,考虑一个民意调查,其中每个问题可以有多个选择并且每个选择可以与多个问题相关联,并且每个选择存储一个投票给它的人的列表,并且选民可以投票给多个选择。)
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
,我希望能够获得与该问题的选项关联的所有选民的列表,即我想要一个查询集,其中包含投票给一个或多个选项的所有选民与 Question 对象关联的 Choices ques1
。
因此,如果选项 c1
和 c2
与问题 ques1
关联,并且选民 v1
和 v2
投票给选项 c1
选民 v3
投票给选择 c2
,然后 运行 关于问题 ques1
的查询,我想要一个包含 [v1, v2, v3]
.
有这方面的问题吗?
效率极低的解决方法当然是遍历 ques1.choices
,并在每次迭代时更新所有选民的 运行 列表。我想通过使用 select_related
可以稍微提高效率,但不是一个干净的查询点。
我们可以做到:
Voter.objects.filter(choice__in=ques1.choices.all()).distinct() # Used distinct() to get unique voters.
在 Django's official documentation 中阅读更多相关信息。