【发布时间】:2020-04-25 02:35:00
【问题描述】:
- 我们以
Project为主要模型,其中包含2个M2M关系字段。
class First(models.Model):
first_results_M2M = models.ManyToManyField(First_Results)
class Second(models.Model):
second_results_M2M = models.ManyToManyField(Second_Results)
class Project(models.Model):
project_first_M2M = models.ManyToManyField(First)
project_second_M2M = models.ManyToManyField(Second)
我正在尝试计算每个
Project对象内所有project_first_M2M对象中存在的所有first_results_M2M对象。下面是计算
first_results_M2M的所有对象的示例,用于Project对象1。
total_first_all = First_Results.objects.filter(first__project__id=1).count()
- 我想在模板中呈现
total_first_all和total_second_all的总数。
Project_Query = Project.objects.all()
for each_proj in Project_Query:
print(each_proj.total_first_all) ## should print the count the `first_resuls_M2M` for each project obj.
- 请让我知道如何以更有效/更快的方式实现它,除了注释。
annotate.total_first_all=Count('project_first_M2M__first_results_M2M')
【问题讨论】:
-
你可以
.annotate(...)。 -
我第一次尝试使用注释然后我意识到在多个字段上使用注释会使查询非常慢。 `stackoverflow.com/questions/59622503/…
-
如果您在多个 不同 连接上进行注释,则会生成大量 JOIN(在该示例中总共有四个),这确实会“炸毁”,解决方案表.但是执行这样的查询当然没有任何意义。如果您在此处执行单个嵌套 JOIN,则它会导致两个 JOIN,并且您会考虑所有产生的记录。
-
有没有办法从 django ORM 执行单个嵌套 JOIN 或必须使用原始查询来执行?
-
你使用
Subquery。
标签: django django-models django-rest-framework django-forms django-templates