通过多个多对多字段使用Django聚合计数

时间:2018-12-18 01:14:40

标签: django django-orm django-aggregation django-annotate

给出具有两个M2M字段的Django模型:

class Book(models.Model):
    name = models.CharField(max_length=300)
    authors = models.ManyToManyField(Author)
    publishers = models.ManyToManyField(Publisher)

并从作者查询集开始:

authors = Author.objects.filter(...)

我如何annotate a count与作者互动的发布者数量(非排他性...)?

我可以获得作者拥有的图书数量:

authors.objects.annotate(num_books=Count('book'))

但是我要统计的是所有书籍的出版商数量。

例如,如果数据是这样的:

Book | Authors | Publishers
B1     A1        P1, P2
B2     A2, A1    P1
B2     A2        P1, P2, P3
...

带注释的计数为:

Author |  Publishers
A1        3 (B1-P1, B1-P2, B2-P1)
A2        4 (B2-P1, B3-P1, B3-P2, B3-P3)
...

1 个答案:

答案 0 :(得分:0)

请尝试:

authors.annotate(num_publishers=Count('book__publishers')).values('id', 'num_publishers')

结果将是:

<Queryser [{'id': 1, 'num_publishers': 10}, {'id': 2, 'num_publishers': 2}, ... ]>