2011-07-25 9 views
0

カスタムクエリセットのリストビューを使用してレコードのリストを表示しています。私が取得している列の1つが10進数のフィールドです。私は取得されたすべての行の列の合計値を取得したいと思います。Django - 総称リストビューの列の合計を取得

おそらく私はこれをListViewクラスのget_context_data内で行う必要がありますが、私はそれをどのように処理するかについてはわかりません。この メソッド内のクエリセットで計算を実行しようとすると、クエリが2回実行されることはありませんか?

私のクエリは私のモデルスキーマに完全に適合しておらず、計算を実行したいフィールドはそれ自体が行ごとに計算されます。

return Lesson.objects.select_related().filter(user=self.request.user).extra(select={'total_fee' : 'SELECT SUM(fee_paid) FROM lessons_evaluation WHERE lessons_evaluation.lesson_id=lessons_lesson.id GROUP BY lessons_evaluation.lesson_id', 'desc' : 'SELECT CASE WHEN COUNT(lessons_evaluation.id) = 0 THEN "None Set" WHEN COUNT(lessons_evaluation.id) = 1 THEN GROUP_CONCAT(CONCAT(lessons_student.first_name, " ", lessons_student.last_name)) ELSE CONCAT(COUNT(lessons_evaluation.id), " students") END FROM lessons_evaluation, lessons_student WHERE lessons_evaluation.lesson_id=lessons_lesson.id AND lessons_evaluation.student_id = lessons_student.id GROUP BY lessons_evaluation.lesson_id'}) 

EDIT:

レッスン仲介評価モデルによる学生twith多対多の関係を持っています。

アドバイスありがとうございます。

ありがとうございました。

答えて

0

aggregation機能を使用してデータベースサーバーでこの処理を行うことをおすすめします。理想的には、データベースサーバがa)これらのタイプの操作を実行するように最適化されており、b)ハードウェアがより高く、計算時間がより短くなる可能性が高いため、Webサーバはできるだけ軽くするのが理想的です。

EDIT:これは2つのデータベースヒットを持つ可能性が高いですが、pythonのquerysetに対してiterate-and-sumよりも計算が高速になる可能性があります。

+0

こんにちは、私のクエリは少し複雑です(私は今質問に追加しました)、私が使用したい列は実際にモデルの一部ではありません。集計関数はどこに呼び出す必要がありますか?ありがとう。 – Dan

+0

okですので、明確にしてください。モデルレッスン、評価、学生のレッスンというアプリがありますか? ** EDIT **およびevaluation.lessonとevaluation.studentに外部キーフィールドを使用していますか? – mklauber