论坛首页 编程语言技术论坛

我的DJANGO GROUP BY解决办法改进版

浏览 4566 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-04-09   最后修改:2011-11-06
为方便你的阅读建议查看本文原地址: 猛击我

是的,在 上一篇文章 中很纠结的解决了 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
1
# -*- coding: utf-8 -*-
2
from django.shortcuts import render_to_response
3
from django.db.models import Sum
4
from myproject.models import Staff,Sales_amount
1
def sale_view(request):
2
    sale_gourp_list=Sales_amount.objects.values('staff').annotate(s_amount=Sum('amount')) #按员工对销售数据进行分类汇总
3
    sale_list=[] #用于最后传递给模板的列表
4
    for sale_group in sale_group_list:
5
        sale_list.append({"total_amount":sale_group["s_amount"],"s_list":Sales_amount.objects.filter(staff=sale_group["staff"])}) #将销售数据中员工与当前循环中员工值相等的列表抽取出来,并作为字典键"s_list"值
6
    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中的很像,只是销售额小计那行放到了分类数据的下面,当然现在这个是可以随意调整的了 -_-!!
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics