Django中基于不同过滤器的多个注释

时间:2014-07-31 15:51:12

标签: django filter annotations django-queryset

说我有以下模型:

class Company(models.Model):
    name = models.CharField(max_length=255)

class Unit(models.Model):
    name = models.CharField(max_length=255)
    status = models.CharField(max_length=255)
    company = models.ForeignKey(Company)

我想获得所有公司的列表,以及他们的单位中有多少是“离线”的数量,以及在一个查询中有多少是“在线”。

我知道如何通过以下方式获取一个或另一个的列表:

offline = Company.objects.all().filter(unit__status="offline").annotate(offline_count=Count("unit"))
online = Company.objects.all().filter(unit__status="online").annotate(online_count=Count("unit"))

我希望能够访问生成的queryset对象,如:

companies[0].offline_count
companies[0].online_count

这可能吗?

2 个答案:

答案 0 :(得分:1)

这就是你需要的:

https://pypi.python.org/pypi/django-aggregate-if/

from django.db.models import Q
from aggregate_if import Count, Sum

Company.objects.annotate(
    online_count=Count('unit', only=Q(unit__status="online")),
    offline_count=Count('unit', only=Q(unit__status="offline")),
)

答案 1 :(得分:1)

注意:django-aggregate-if被相同的功能取代为Django 1.8