场景分析:

后台MySql数据库保存了一大批按股票代码命名的数据表,每张表保存的是每只股票的日线数据。

stock_000002

stock_600030

stock_600020

...一共3000多个表。

Django中如果要按股票代码展示每张表的数据,利用常规ORM模型变得非常困难,因为有3000多个表,就需要建3000多个模型。

解决办法:

1. 根据表名、字段等动态创建ORM表模型

def create_model(name, fields=None, app_label='', module='', options=None, admin=None):
class Meta:
pass
if app_label:
setattr(Meta, 'app_label', app_label)
if options is not None:
for key, value in options.items():
setattr(Meta, key, value)
attrs = {'__module__': module, 'Meta': Meta}
if fields:
attrs.update(fields)
# 继承models.Model
return type(name, (models.Model,), attrs)

2. 调用create_model, 返回的custom_model就是表对应的ORM模型

def new_stock(tab_name):
"""
动态创建数据模型
:param tab_name: 表名
:return: 返回模型类
"""
fields = {
'ts_code': models.CharField(max_length=20),
'trade_date': models.CharField(max_length=20, unique=True),
'open': models.FloatField(null=False, default=0.0),
'high': models.FloatField(null=False, default=0.0),
'low': models.FloatField(null=False, default=0.0),
'close': models.FloatField(null=False, default=0.0),
'pre_close': models.FloatField(null=False, default=0.0),
'change': models.FloatField(null=False, default=0.0),
'pct_chg': models.FloatField(null=False, default=0.0),
'vol': models.FloatField(null=False, default=0.0),
'amount': models.FloatField(null=False, default=0.0)
}
options = {'ordering': ['trade_date'], 'db_table': tab_name, }
custom_model = create_model(tab_name, fields, options=options, app_label='stock', module='stock.models')
return custom_model

3. http请求按日期降序排列的股票日线数据。

def stock_detail(request, pk):
tab_name = 'stock_' + pk
stock_mod = new_stock(tab_name) # 查询
if request.method == 'GET':
limit = request.GET.get('limit')
offset = request.GET.get('offset')
# 查询总记录条数
total = stock_mod.objects.count() # 结果按日期降序排列
datalist = stock_mod.objects.all().order_by('-trade_date')[int(offset): int(offset)+int(limit)]
json_list = [] import json
# 返回json字符串
for data in datalist:
json_dict = model_to_dict(data)
json_list.append(json_dict) result = dict()
rows = list()
result['total'] = total
result['rows'] = json_list logger.info('获取股票列表')
return JsonResponse(result, safe=False)

HTTP请求:GET /stock/000002/?offset=0&limit=10

000002与"stock_"组合成表名"stock_000002"

offset为数据的起始位置

limit为返回数据的条数

按表查询得到的datalist数据组织成json格式返回浏览器。

最新文章

  1. Hadoop HDFS负载均衡
  2. ajax 对象创建 兼容各个浏览器
  3. Sky数[HDU2097]
  4. PHP如何取出数组最后一个元素?
  5. Css3中的响应式布局的应用
  6. 在DataTable和DataView中查找指定记录
  7. JSR303 Bean Validation 技术规范特性概述
  8. 如何简单愉快的上手PipelineDB
  9. Java课程之团队开发(NABCD需求分析)
  10. Cookie的使用(14)
  11. js---设置cookie的方法
  12. 响应式网站设计(Responsive Web design)
  13. 关于VC预定义常量_WIN32,WIN32,_WIN64(转)
  14. Golang中使用kafka
  15. apache kafka系列之Producer处理逻辑
  16. 【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)
  17. Spring中依赖注入的四种方式
  18. 定期删除Azure存储账号下N天之前的数据文件-ARM
  19. Java 7 新特性try-with-resources语句
  20. javascript json数据的处理

热门文章

  1. 不知道Java类文件结构的同学,看这篇文章就够了
  2. send()/ recv() 和 write()/ read()
  3. SecureCRT使用+堡垒机简单使用
  4. EDM营销技巧之如何进行用户唤醒
  5. day64—ajax技术学习笔记
  6. Selenium学习之==>Css Selector使用方法
  7. oracle ogg 单实例单向简单搭建测试(oracle-oracle)
  8. Linux(Ubuntu)常用命令 & vim基本操作
  9. Scratch少儿编程系列:(八)演奏简单音乐
  10. unsigned char bcd串乱码问题解决