我的情况有些复杂,所以请耐心等待。我有4个型号:
我的一般JSON输出是这样的:
[ {name: 'coat_type',
cat_count: 3,
dog_count: 5,
total_count: 8,
sub_cats: [ {name: 'furry', cat_count: 1, dog_count: 3, total_count: 4},
{name: 'shaggy', cat_count: 2, dog_count: 2, total_count: 4} ],
{name: 'facial_features', ... } ]
所以这是我的一组查询,我认为这些查询效率不高:
output = []
for main_cat in MainCategory.objects.all():
...
sub_cats = Category.objects.filter(main_category=main_cat)
counts = sub_cats.annotate(
cat_count = Count('cat', distinct=True),
dog_count = Count('dog', distinct=True),
#how do i aggregate total count here?
#total_count = cat_count + dog_count
).values('name', 'ip_count', 'doc_count', 'total_count')
main_cat_dict = {
'name': main_cat.name,
'sub_cats': counts,
...
}
output.append(main_cat_dict)
我认为子类别聚合是可以的,但问题是我仍然需要遍历每个MainCategory。此外,我不确定如何计算每个子类别中的总数。
提前致谢!
答案 0 :(得分:0)
你可以这样做:
sub_cats = Category.objects.filter(main_category__in=MainCategory.objects.all())
然后像以前一样进行注释和values
调用。当然,您可以先对MainCategory
模型进行过滤,以排除某些主要类别。
基于其他注释不可能(至少不使用标准的Django ORM)进行注释。在Python中进行一些后处理更容易获得每个条目的总计数:
for d in sub_cats:
d['total_count'] = d['cat_count'] + d['dog_count']