我的django group by


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM