是的,在上一篇文章中很糾結的解決了 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中的很像,只是銷售額小計那行放到了分類數據的下面,當然現在這個是可以隨意調整的了 -_-!!

