PythonStock(5):使用 dataTable+python 实现服务端多字段排序

41 篇文章 314 订阅
30 篇文章 151 订阅

前言


使用Python开发一个股票项目。
项目地址:
https://github.com/pythonstock/stock
相关资料:
http://blog.csdn.net/freewebsys/article/category/7076584
主要使用开发语言是python。
使用的lib库是pandas,tushare,TensorFlow,tornado等。

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/77119420 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

1,使用dataTable实现多字段排序


继续对 jQuery的 dataTable进行研究。
发现了,对于服务端,js返回的ajax请求是这样的:

order: order[0][dir] ,val: b'asc'
order: order[0][column] ,val: b'0'

开始还不明白,那个数组下标是啥意思。感觉取出来好费劲啊。

后来看了下官网的文档:

https://datatables.net/examples/basic_init/multi_col_sort.html

是支持多个字段进行排序的。而order[0] 的下标代表第几个。

2,修改排序代码


首先从request当中获得排序的参数:

order_by_column = []
order_by_dir = []
# 支持多排序。使用shift+鼠标左键。
for item, val in self.request.arguments.items():
    # print("order:", item)
    if str(item).startswith("order["):
        print("order:", item, ",val:", val[0])
    if str(item).startswith("order[") and str(item).endswith("[column]"):
        order_by_column.append(int(val[0]))
    if str(item).startswith("order[") and str(item).endswith("[dir]"):
        order_by_dir.append(val[0].decode("utf-8"))  # bytes转换字符串

设置两个数组保存参数。分别是多参数排序的column和dir。
但是这个数据是一个column的index,需要用index进行索引查询报表的column 名称。

还好这个字典已经存储了。

StockWebData(
        type="基本面数据",
        name="成长能力",
        table_name="ts_growth_data",
        columns=['quarter', 'code', 'name', 'mbrg', 'nprg', 'nav', 'targ', 'epsg', 'seg'],
        column_names=["季度", "代码", "名称", "主营业务收入增长率(%)", "净利润增长率(%)", "净资产增长率", "总资产增长率",
                      "每股收益增长率", "股东权益增长率"],
        order_by=" quarter desc  "
    )

增加order by 排序:

# 增加排序。
if len(order_by_column) != 0 and len(order_by_dir) != 0:  
    order_by_sql = "  ORDER BY "
    idx = 0
    for key in order_by_column:
        # 找到排序字段和dir。
        col_tmp = stock_web.columns[key]
        dir_tmp = order_by_dir[idx]
        if idx != 0:
            order_by_sql += " ,%s %s" % (col_tmp, dir_tmp)
        else:
            order_by_sql += " %s %s" % (col_tmp, dir_tmp)
        idx += 1

拼接好的sql 放到select 语句的后面就行了。

前段页面修改:

var myTable = $('#dynamic-table').DataTable( {
    "bFilter": false,
    "ordering": true,
    "processing": true,
    "serverSide": true,
    "lengthMenu": [[20, 30, 50, 100,1000, -1], [20, 30, 50, 100,1000, "All"]],
    "language": {
        "url": "/static/js/datatables.Chinese.json"
    },
    "ajax": "/stock/api_data?name="+nameParam,
    "columns": [
        {% for column in stockWeb.columns %}
            { "data": "{{ column }}" },
        {% end %}
    ]
} );

3,修改后效果


使用方法:

1,点击是单个字段进行排序。

2,按照【shift】,点击多个,即可完成多字段排序。

效果如下:

后台服务端生成sql:

 SELECT * FROM ts_stock_basics   ORDER BY  outstanding desc ,totals desc ,pe desc LIMIT 0,20 

普通排序: 按照一个字段进行排序

4,总结


增加了排序功能之后可以对报表数据中的指标直接进行排序显示。
这样可以更直观的查看股票数据。分析股票行情。多排序是一个很实用的功能。

这个排序是在服务端实现的,再使用分页的时候也是多排序分页的。dataTable是一个不错的框架。

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/77119420 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值