如何使用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, ...)
棘手的部分是我不想过滤但只想注释给定列表中使用的软件的数量。
感谢任何帮助: - )
答案 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。但我担心这超出了我的水平。