6

私は単純な要件(単純な実装ではない)を取得し、dbに複数のヒットを与えることなく、またクエリセットを使用せずにそれを達成する方法を考え出しました.extra()

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

Project:
  name = xxx
  code = xxx

プロジェクトには、さまざまなステータスを取得したタスクが含まれています。(status = 3が完了したと仮定します)次に、以下のように、すべてのプロジェクトとその合計タスクおよび完了したタスクをリストします。

  1. プロジェクト1、total_tasks = 5、completed_tasks = 2
  2. プロジェクト1、total_tasks = 2、completed_tasks = 1

アノテーションでtotal_tasksを取得できますが、annotationで条件が必要なため、completed_tasksは取得できません。とにかくそれをすることはありますか?

4

3 に答える 3

9

この機能はDjango1.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()
于 2015-10-20T18:12:46.750 に答える
0

追加のクエリを気にしない場合は、1つではなく2つのクエリセットを導出できます。1つ目は合計数を取得し、2つ目はフィルターをtasks_statusかけて完了した数を取得できます。

from django.db.models import Count
all_projects = Project.objects.all()
total_counts = all_projects.annotate(count = Count('tasks'))
completed_counts = all_projects.filter(tasks_status = 3).annotate(count = Count('tasks'))
于 2010-08-31T09:46:06.060 に答える
0

それが役立つかどうかはわかりませんが、独自のカスタム注釈オブジェクトを作成できます。条件付きの部分はありませんが、これで完了です。私はこのリンクに基づいてソリューションを作成しました: http ://www.voteruniverse.com/Members/jlantz/blog/conditional-aggregates-in-django

しかし、そこでの例は使用しませんでした。代わりに、集計のdjangoコードを調べて、SumオブジェクトとCountオブジェクト自体を拡張しました。

于 2010-09-02T20:16:46.220 に答える