Django中的条件注释

Nar*_*mma 4 django annotate

我得到了简单的要求(不是简单的实现),并且在没有对db进行多次命中的情况下确定如何实现它,并且没有.extra()在queryset中.

Task:
  name = xxx
  status = models.IntegerField(choices=some_choices)
  project = ForeignKey(Project)

Project:
  name = xxx
  code = xxx
Run Code Online (Sandbox Code Playgroud)

项目包含具有各种状态的任务.(假设status = 3已完成)现在,我想列出所有项目的总任务和已完成的任务,如下所示

  1. 项目1,total_tasks = 5,completed_tasks = 2
  2. 项目1,total_tasks = 2,completed_tasks = 1

我能够使用注释获得total_tasks,但不能获得completed_tasks,因为它需要注释中的条件.无论如何要做到这一点?

Jôn*_*tro 5

此功能是Django 1.8中的新功能.

请参阅:https://docs.djangoproject.com/en/1.8/ref/models/conditional-expressions/

这是一种可能性:

from django.db.models.aggregates import Count
from django.db.models.expressions import F, Value, Case, When

projects = Project.objects.annotate(
        total_tasks=Count('task__pk'),
        completed_tasks=Count(Case(
           When(status=3, then=F('task__pk')),
           output_field=IntegerField()
        ))).all()
Run Code Online (Sandbox Code Playgroud)


Har*_*rel 0

我不知道这是否有帮助,但您可以编写自己的自定义注释对象。我刚刚完成了,但没有条件部分。我的解决方案基于此链接: http://www.voteruniverse.com/Members/jlantz/blog/conditional-aggregates-in-django

但没有使用那里的例子。相反,我查看了 django 聚合代码并扩展了 Sum 和 Count 对象本身。