Django 1.8:查询集成员的注释计数没有过滤

时间:2015-08-21 17:49:08

标签: django-models django-queryset data-annotations django-orm django-1.8

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

例如: 我如何根据他们公司正在使用的软件计数对所有工人进行排序?

  • Bill 3(Windows,Office,Visio)
  • Tom 2(Windows,Office)
  • Anton 1(办公室)
  • 彼得0
  • Stephan 0

代码:

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, ...)

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

感谢任何帮助: - )

1 个答案:

答案 0 :(得分:1)

看起来像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并使用SQL函数GROUP_CONCAT。但我担心这超出了我的水平。