首页 > 解决方案 > Django group by 和 count(*),包括零计数

问题描述

class Author(models.Model):
   name = models.CharField(max_length=50)

class Book(models.Model):
   name = models.CharField(max_length=50)
   author = models.ForeignKey(Author,related_name='book' on_delete=models.CASCADE)
   is_deleted = models.BooleanField(default=False)

我想显示每个作者的书籍数量(包括零计数)。我的代码:

Book.objects.filter(is_deleted =False).values('author').annotate(num=Count('id'))

但它只返回大于零的值并失去了许多作者。我怎样才能得到这样的结果:

author1:0,
author2:1,
author3:2,

请帮助我并提前感谢^^。

标签: djangogroup-by

解决方案


也许你可以这样尝试(使用related objects):

authors = Author.objects.annotate(
    book_count=Count(
        'book',
        filter=Q(book__is_deleted=False)
    )
)
authors.values('name', 'book_count')

推荐阅读