2012-04-30 71 views
-1

我有兩個查詢集:如何添加屬性/屬性/ ???要查詢集(如註釋)

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')) 

有沒有辦法用一個查詢集要做到這一點(有一個for循環在我的模板)?

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 %} 
代替

???將平均值(現在我使用分部的總和 - 因爲它更容易調試 - 如果我看到podsuma小於SUMA - 我想知道它的工作原理

+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

我沒有看到這個問題是如何增加任何東西的,但通常我會說在這裏的第二個選項更好。將查詢集轉換爲列表以便向其添加數據意味着您將失去查詢集的所有優點和效率,並且會擴大您的視圖。唯一的好處是減少查詢,但是我會在查看優化之前使用緩存來解決這個問題。 – Greg