是的,在上一篇文章中很纠结的解决了 Django 下 group by的解决办法 ,但是性能和代码上都有些惨不忍睹,而且大家都说最好把问题解决在veiw层,所以有了这个改进版。总体思路是先按照员工对所有销售数据进行分类汇总,然后进行循环遍历,将销售数据中和当前分类项员工相同的提取出来,作为列表添加,然后在模板里用循环回滚出来就可以了。代码如下:
仍然是那个数据库:models.py
01 | # -*- coding: utf-8 -*- |
02 | from django.db import models |
04 | Class Staff(models.Model): #员工表 |
05 | name = models.CharField(max_length = 20 ) |
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
04 | <meta http-equiv= "Content-Type" content= "text/html;charset=utf-8" /> |
05 | <title>员工销售数据分类统计</title> |
10 | {% for sale in sale_list %} |
17 | <tr bgcolor= "#CCCCCC" > |
18 | <td>{{sale.s_list.0.staff}}</td><!--显示员工--> |
19 | <td>{{sale.total_amount}}</td><!--显示当前员工销售小计--> |
最终效果和解决办法1中的很像,只是销售额小计那行放到了分类数据的下面,当然现在这个是可以随意调整的了 -_-!!