Django和条件聚合


问题内容

我有两个模型,作者和文章:

class Author(models.Model):
    name = models.CharField('name', max_length=100)

class Article(models.Model)
    title = models.CharField('title', max_length=100)
    pubdate = models.DateTimeField('publication date')
    authors = models.ManyToManyField(Author)

现在,我想选择所有作者,并用他们各自的文章数注释它们。这与Django的聚合容易。问题是,它应该只计算已经发布的文章。根据Django票证跟踪器中的票证11305,这还不可能。我尝试使用该CountIf票证中提到的注释,但未引用datetime字符串,并且未进行所需的所有联接。

那么,除了编写自定义SQL之外,什么是最好的解决方案?


问题答案:

Django 1.8+解决方案

从Django
1.8开始,条件表达式可用于构建查询集。

有关更多详细信息,请查阅文档,但是针对您问题的快速解决方案如下所示:

today = datetime.date.today()
authors = Author.objects.all().annotate(article_count=Sum(
    Case(When(articles__pubdate__lt=today, then=1),
         output_field=IntegerField())
))

我没有检查,但是应该可以。