2012-04-30 23 views
-1

私は2つのクエリセットを持っている(注釈のような)クエリセットする:プロパティ/属性を追加する方法/ ???

category_list_avg =Category.objects.filter(operation__date__gte = year_ago).annotate(podsuma = Sum('operation__value')) 
category_list = Category.objects.annotate(suma = Sum('operation__value')) 

は1つのクエリセットでこれを行う方法があります(私のテンプレートでループのためにそこにありますか)?

UPD

テンプレート:の代わりに

{% for category in category_list %} 
<tr> 
    <td><a href="{{ category.id }}/">{{ category.name }}</a></td> 
    <td style="text-align:right{% if category.suma|default:0 < 0 %};color:red{% endif %}"> 
    {{ category.suma|default:0|currency }}</td> 
    {% for monthsum in category.get_month_sum_series %} 
    <td style="text-align:right{% if monthsum.1 < 0 %};color:red{% endif %}">{{ monthsum.1|currency }}</td> 
    {% endfor %} 
    <td style="text-align:right">???</td> 
</tr> 
{% endfor %} 

???平均値になります(今はサブパートの合計を使用しています - デバッグが簡単で、ポダスクがスムマよりも小さいと分かります) -

+0

[あなたの前の質問](http://stackoverflow.com/questions/10376699から差がないように聞こえるを使用/ annotate-then-filter-then-annotate)テンプレートを表示してください。 – okm

+0

これは接続されているためですが、sta ckoverflowersは私の問題を解決しません - なぜそれが間違った方法であるかを説明するだけです - 私は答えを得るために質問を "改造"しようとします。私は3日間答えを探しています –

答えて

0

平均値を取得するには別のクエリを実行する必要がありますそしてビューまたはモデルのいずれかで、category_listにそれらを添付:

# in view 
category_list = Category.objects.annotate(suma = Sum('operation__value')) 
one_year_ago_avg = dict(Category.objects.filter(operation__date__gte = year_ago).annotate(avg = Avg('operation__value')).values_list('pk', 'avg')) 
for cat in category_list: 
    cat.one_year_ago_avg = one_year_ago_avg.get(cat.pk) 


# or in model 
class Category(models.Model): 
    def one_year_ago_avg(self): 
     year_ago = ... 
     return self.operation_set.filter(date__gte=year_ago).aggregate(Avg('value')).values()[0] 

次にテンプレートで{{ category.one_year_ago_avg }}

+0

この質問がどのようにオリジナルに何が追加されるのかわかりませんが、一般的にはここでは2番目のオプションが良いと言います。クエリーセットをリストに変換してデータを追加すると、クエリーセットのすべての利点と効率が失われ、ビューが肥大化します。唯一の利点は少ないクエリですが、私はクエリの最適化を見る前にその問題を解決するためにキャッシュを使用したいと思います。 – Greg

関連する問題