是的,在上一篇文章中很糾結的解決了 Django 下 group by的解決辦法 ,但是性能和代碼上都有些慘不忍睹,而且大家都說最好把問題解決在veiw層,所以有了這個改進版。總體思路是先按照員工對所有銷售數據進行分類匯總,然后進行循環遍歷,將銷售數據中和當前分類項員工相同的提取出來,作為列表添加,然后在模板里用循環回滾出來就可以了。代碼如下:
仍然是那個數據庫:models.py
01 |
# -*- coding: utf-8 -*- |
02 |
from django.db import models |
03 |
04 |
Class Staff(models.Model): #員工表 |
05 |
name = models.CharField(max_length = 20 ) |
06 |
07 |
Class Sales_amount(models.Model): #銷售表 |
08 |
staff = models.ForeignKey(Staff) |
09 |
sdate = models.DateField() |
10 |
amount = models.DecimalField(max_digits = 7 ,decimal_places = 2 ) |
Views.py
01 |
# -*- coding: utf-8 -*- |
02 |
from django.shortcuts import render_to_response |
03 |
from django.db.models import Sum |
04 |
from myproject.models import Staff,Sales_amount |
05 |
def sale_view(request): |
06 |
sale_gourp_list = Sales_amount.objects.values( 'staff' ).annotate(s_amount = Sum ( 'amount' )) #按員工對銷售數據進行分類匯總 |
07 |
sale_list = [] #用於最后傳遞給模板的列表 |
08 |
for sale_group in sale_group_list: |
09 |
sale_list.append({ "total_amount" : sale_group[ "s_amount" ], "s_list" : Sales_amount.objects. filter ( staff = sale_group[ "staff" ] )}) #將銷售數據中員工與當前循環中員工值相等的列表抽取出來,並作為字典鍵"s_list"值 |
10 |
return render_to_response( "list.html" , locals ()) |
list.html
01 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > |
02 |
<html> |
03 |
<head> |
04 |
<meta http-equiv= "Content-Type" content= "text/html;charset=utf-8" /> |
05 |
<title>員工銷售數據分類統計</title> |
06 |
</head> |
07 |
<body> |
08 |
09 |
<table border= "1" > |
10 |
{% for sale in sale_list %} |
11 |
{% for s in sale %} |
12 |
<tr> |
13 |
<td>{{s.sdate}}</td> |
14 |
<td>{{s.amount}}</td> |
15 |
</tr> |
16 |
{% endfor %} |
17 |
<tr bgcolor= "#CCCCCC" > |
18 |
<td>{{sale.s_list.0.staff}}</td><!--顯示員工--> |
19 |
<td>{{sale.total_amount}}</td><!--顯示當前員工銷售小計--> |
20 |
</tr> |
21 |
{% endfor %} |
22 |
</table> |
23 |
</body> |
24 |
</html> |
最終效果和解決辦法1中的很像,只是銷售額小計那行放到了分類數據的下面,當然現在這個是可以隨意調整的了 -_-!!