Django中利用type动态操作数据库表
场景分析:
后台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格式返回浏览器。
Django中利用type动态操作数据库表的更多相关文章
- (转载)在Delphi中利用MSDASC来配置数据库链接
		在Delphi中利用MSDASC来配置数据库链接 在运行期进行数据库的连接是一个问题,自己写一个窗体配置吧,数据库不一样,所用的参数也不一样,还有那讨厌的连接字符串,有时真不知该写什么好.那天无意中发 ... 
- Django中的ORM进阶操作
		Django中的ORM进阶操作 Django中是通过ORM来操作数据库的,通过ORM可以很easy的实现与数据库的交互.但是仍然有几种操作是非常绕也特别容易混淆的.于是,针对这一块,来一个分类总结吧. ... 
- IE7中使用Jquery动态操作name问题
		问题:IE7中无法使用Jquery动态操作页面元素的name属性. 在项目中有出现问题,某些客户的机器偶尔会有,后台取不到前台的数据值. 然开发和测试环境总是不能重现问题.坑爹之处就在于此,不能重现就 ... 
- hibernate动态创建数据库表名几种方式
		数据库中数据量很大, 但又不可以删除时同时又要优化程序检索数据时间. 答:方式有很多比如 创建数据库表分区,创建索引, 存储过程等; 我这里采用动态创建数据库表的方式. 完全可以在不创建表分区情况下实 ... 
- SQL分类之DDL:操作数据库表
		DDL:操作数据库表 1.操作数据库:CRUD 1.C(Create):创建 创建数据库: create database 数据库名称 创建数据库,判断不存在,再创建: create database ... 
- 043:Django使用原生SQL语句操作数据库
		Django使用原生SQL语句操作数据库 Django配置连接数据库: 在操作数据库之前,首先先要连接数据库.这里我们以配置 MySQL 为例来讲解. Django 连接数据库,不需要单独的创建一个连 ... 
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
		SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ... 
- 在django中使用orm来操作MySQL数据库的建表,增删改
		多张表之间的三种关系:一对一,一对多,多对多 创建表 一对一 xx = models.OneToOneField(to='表明',to_field='字段名',on_delete=models.CAS ... 
- Django框架中的model(操作数据库)
		什么是ORM ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复 ... 
随机推荐
- localstorage sessionstorage cookie的区别
			一.基本概念 Cookie cookie比较小,大小限制在4kb左右,是网景公司的前雇员 LouMontulli 在1993年3月的发明.它的主要用途有保存登录信息,比如你登录某个网站市场可以看到“记 ... 
- 微信小程序那些开发缺点
			早闻微信小程序是个坑,结果名不虚传,细数一下我开发小程序遇过到坑. UI组件过度封装. 微信小程序的组件是模仿react.js或vue.js的web组件设计的,并且封装了weui.css样式. PS: ... 
- 第四周总结&实验报告二
			第四周总结&实验报告二 课程总结 这周我们学习了string类,以及很多string类的很多操作方法,同时string也是一个对象,在用到它时我们首字母需要大写,这周我们还加深了对函数构造的理 ... 
- SpringMvc中ModelAndView模型的应用
			/** * 目标方法的返回值可以是 ModelAndView 类型. * 其中可以包含视图和模型信息 * SpringMVC 会把 ModelAndView 的 model 中数据放入到 reques ... 
- RotateZoom.cpp——Inter
			// RotateZoom.cpp : Defines the entry point for the console application. // #include "stdafx.h& ... 
- JavaSE部分1.Java基础
			1.为什么重写equals()还要重写hashcode()? (equals()和hashCode()是java Object中两个基本方法) 首先equals与hashcode间的关系是这样的: ... 
- NIO组件之buffer
			Java NIO指的是new IO ,相对OIO,也称non-blocking IO,对应四种基本IO类型中的IO多路复用,主要有有三大核心组件,Channel(管道),Buffer(缓冲区),sel ... 
- 【MM系列】SAP MM模块-MIGO收货后自动打印收货单
			公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-MIGO收货后自动 ... 
- Java——LinkedHashMap源码解析
			以下针对JDK 1.8版本中的LinkedHashMap进行分析. 对于HashMap的源码解析,可阅读Java--HashMap源码解析 概述 哈希表和链表基于Map接口的实现,其具有可预测的迭 ... 
- js中 json对象的转化  JSON.parse()
			JSON.parse() 方法用来解析JSON字符串,json.parse()将字符串转成json对象.构造由字符串描述的JavaScript值或对象.提供可选的reviver函数用以在返回之前对所得 ... 
