我得到了简单的要求(不是简单的实现),并且在没有对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已完成)现在,我想列出所有项目的总任务和已完成的任务,如下所示
我能够使用注释获得total_tasks,但不能获得completed_tasks,因为它需要注释中的条件.无论如何要做到这一点?
此功能是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)
我不知道这是否有帮助,但您可以编写自己的自定义注释对象。我刚刚完成了,但没有条件部分。我的解决方案基于此链接: http://www.voteruniverse.com/Members/jlantz/blog/conditional-aggregates-in-django
但没有使用那里的例子。相反,我查看了 django 聚合代码并扩展了 Sum 和 Count 对象本身。
| 归档时间: |
|
| 查看次数: |
2818 次 |
| 最近记录: |