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())
))
我没有检查,但是应该可以。