2011-07-22 5 views
0

私は私のアプリに設定し、次のモデルがあります:学生Django - 多対多の関係で中間モデルからデータを取得するにはどうすればよいですか?

  • レッスン
  • 評価

レッスンと学生モデルが評価による多対多の関係を持っています。評価モデルでは、レッスンに受け取った手数料も保存します。私はレッスンモデルでこれを実際に保管してから、生徒数を掛けなければならないが、何らかの理由で生徒がレッスンの全額を払っていない可能性があるので、個別に追跡する必要がある。

私は与えられた時間内にすべてのレッスンの一覧を作成しようと合計金額は合計金額がですべてのレッスンのために受信レッスン

  • のために受信

    1. を表示する列が含まれていますその期間。現時点で

  • は、私はすべてのレッスンを返すために、一般的なビューを使用していると私は受け取った合計料金を計算私のレッスンのモデルで定義されている簡単な方法があります。

    def total_fee(self): 
        evaluations = self.evaluation_set.all() 
        total = 0; 
        for e in evaluations: 
         total += e.fee_paid 
    
        return total 
    

    は、しかし、私は」を私はそれを実行したときに、このビューが87の別個のSQLクエリを必要とすることを示しています!

    明らかに、私は毎回それを行うことはできません。どのようにして一度にすべてのデータを取得できますか?

    アドバイスをいただければ幸いです。

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

    答えて

    0

    私は個人的にDjangoのAggregation機能を使ってこの問題に取り組んでいると思います。私はあなたのモデルを見ることなく、データベースの構造を概念化することは難しいのですが、私は、コールが次のようになりますと思う:あなたの評価セット内のすべてでのために支払われたすべての手数料の合計を与える必要があり

    from django.db.models import Sum 
    total = self.evaluation_set.all().aggregate(total=Sum('fee_paid'))['total'] 
    
    1 DBコール、私は思う。私はそれを試していないので、塩の穀物でそれを取る。

    希望に役立ちます。

    +0

    ありがとうございます、おそらく、これはすべての合計を与えるでしょうか?個々の行にも使用できますか?個々の行の – Dan

    +0

    は注釈機能を見ます。 [django-annotations]( – mklauber

    +0

    )これは、すべての指定されたクエリセットのすべての行の 'fee_paid'の列値。それは支払われたすべての手数料の合計になります。私は個々の行についてのあなたの質問にどういう意味があるのか​​分かりません。どのようにして1行を合計することができますか? :-) 行の別のサブセットで動作する可能性がある場合は、はい。また、これがあなたの質問に適切に答えると思うなら、それを回答としてマークし、私に投票を与えてください。それは感謝しています。ありがとう。 – jnadro52

    関連する問題