Django 1.8:查询集成员计数的注释无需过滤

Django 1.8: Annotation of the queryset members count WITHOUT filtering

如何使用Django 1.8 ORM 来统计一个对象有多少个成员?

例如: 我如何根据公司使用的软件数量对所有员工进行排序?

代码:

def Software(model.Model):
    name = models.CharField(max_length=200)

def Company(models.Model):
    software = models.ManyToManyField(Software)

def Worker(models.Model):
    company = models.ForeignKey(Company)

software = Software.objects.filter(price>60)    # [<Software: Windows>,...] 
workers = Worker.objects.filter(company__software__in=software).
             annotate(software_count=Count('company__software‘))

for worker in workers:
    print „%s %s (%s)" % (worker.name, worker.software_count, ...)

棘手的部分是我不想过滤但只想注释软件的计数,使用给定列表。

感谢任何帮助:-)

看起来像 conditional aggregation(或本例中的注释)。代码未经测试,但应该类似于以下内容:

class Software(model.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=8, decimal_places=2)

class Company(models.Model):
    software = models.ManyToManyField(Software)

class Worker(models.Model):
    company = models.ForeignKey(Company)

workers = Worker.objects.all().annotate(software_count=Sum(
    Case(When(company__software__price__gt=60, then=1), output_field=IntegerField())
))

for worker in workers:
    print "%s %s" % (worker.name, worker.software_count)

但是,您没有使用的软件列表。我认为要在同一个查询中得到这个,你必须更深入地研究 SQL,我认为没有办法用 ORM 来实现它。好吧,也许 Func() expression and using the SQL-function GROUP_CONCAT 是可能的。但恐怕这超出了我的水平。