Django 1.8:查询集成员计数的注释无需过滤
Django 1.8: Annotation of the queryset members count WITHOUT filtering
如何使用Django 1.8 ORM 来统计一个对象有多少个成员?
例如:
我如何根据公司使用的软件数量对所有员工进行排序?
- 账单 3(Windows、Office、Visio)
- 汤姆 2(Windows,办公室)
- 安东 1 号(办公室)
- 彼得 0
- 斯蒂芬 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, ...)
棘手的部分是我不想过滤但只想注释软件的计数,使用给定列表。
感谢任何帮助:-)
看起来像 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 是可能的。但恐怕这超出了我的水平。
如何使用Django 1.8 ORM 来统计一个对象有多少个成员?
例如: 我如何根据公司使用的软件数量对所有员工进行排序?
- 账单 3(Windows、Office、Visio)
- 汤姆 2(Windows,办公室)
- 安东 1 号(办公室)
- 彼得 0
- 斯蒂芬 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, ...)
棘手的部分是我不想过滤但只想注释软件的计数,使用给定列表。
感谢任何帮助:-)
看起来像 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 是可能的。但恐怕这超出了我的水平。