Django嵌套多域对象计数查询 我们有Project作为主要模型,其中包含2个M2M关系字段
我正在尝试统计每个Django嵌套多域对象计数查询 我们有Project作为主要模型,其中包含2个M2M关系字段,django,django-models,django-rest-framework,django-forms,django-templates,Django,Django Models,Django Rest Framework,Django Forms,Django Templates,我正在尝试统计每个项目对象内所有项目项目对象的第一个结果中存在的所有对象 下面的示例用于计算Projectobject 1的first\u results\u M2M的所有对象 total\u first\u all=first\u Results.objects.filter(first\u project\u id=1.count() 我想在模板中呈现total\u first\u all和total\u second\u all的总计数 除了注释外,请让我知道如何更有效/快速地实现
项目
对象内所有项目
项目对象的第一个结果
中存在的所有对象
Project
object 1的first\u results\u M2M
的所有对象total\u first\u all=first\u Results.objects.filter(first\u project\u id=1.count()
- 我想在模板中呈现
和total\u first\u all
的总计数total\u second\u all
- 除了注释外,请让我知道如何更有效/快速地实现它
annotate.total\u first\u all=Count('project\u first\u M2M\u first\u results\u M2M')
您可以选择查询集,如:
from django.db.models import Count
project_query = Project.objects.annotate(
total_first_all=Count('project_first_M2M__first_results_M2M')
)
for project in project_query:
print(project.total_first_all)
您可以
.annotate(…)
。我第一次尝试使用annotate,然后意识到在多个字段上使用annotate会使查询速度非常慢`如果对多个不同的联接进行注释,则会生成大量联接(在该示例中,总共有四个联接),这确实会“炸毁”解决方案表。但是执行这样的查询当然没有任何意义。如果在此处执行单个嵌套联接,则会导致两个联接,有没有办法从django ORM执行单个嵌套联接,或者必须使用原始查询?您使用子查询
项目查询
对象时只返回一列,我正在使用Postgresql
DB.@Arbazzussain:如果我们使用.values(…)
和Count(…)
表达式呢?很抱歉它抛出了AttributeError
,AttributeError:“Count”对象没有属性“split”
,对我来说似乎是一个很好的解决方案,你觉得呢?@Arbazzussain:对不起,还是有个错误。
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.
from django.db.models import Count
project_query = Project.objects.annotate(
total_first_all=Count('project_first_M2M__first_results_M2M')
)
for project in project_query:
print(project.total_first_all)
from django.db.models import Count, OuterRef, Subquery
project_query = Project.objects.annotate(
total_first_all=Subquery(
First_Results.objects.filter(first__project=OuterRef('pk')).values('first__project').values(cnt=Count('*')).order_by('first__project')
),
total_second_all=Subquery(
Second_Results.objects.filter(second__project=OuterRef('pk')).values('second__project').values(cnt=Count('*')).order_by('second__project')
)
)