如何在Django中有效地聚合多个模型?

时间:2014-06-19 21:13:50

标签: python django

我的情况有些复杂,所以请耐心等待。我有4个型号:

  1. MainCategory
  2. 类别(主要的外键)
  3. Cat(m2m with Category)
  4. 狗(m2m with Category)
  5. 我的一般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。此外,我不确定如何计算每个子类别中的总数。

    提前致谢!

1 个答案:

答案 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']