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格式返回浏览器。

原文地址:https://www.cnblogs.com/bryant24/p/11445688.html

时间: 2024-08-15 05:30:45

Django中利用type动态操作数据库表的相关文章

Django中的ORM进阶操作

Django中的ORM进阶操作 Django中是通过ORM来操作数据库的,通过ORM可以很easy的实现与数据库的交互.但是仍然有几种操作是非常绕也特别容易混淆的.于是,针对这一块,来一个分类总结吧. 对于ORM对数据库的基本操作前面model里已经有了介绍,这里专门针对ORM的一对多.多对多.正向.反向等操作来讲解用法和注意事项. 铭记于心的两条: 在联表操作过滤查找数据时用双下划线 "__" 在取数据时用点 "." 一.一对多 首先来设计两张简单的表格,并在其中

django中的models模块及数据库一些基本操作

使用django自带的轻量级数据库sqlite mvc 开发模式(Java,php)             django是mtv模式 m------model 操作数据库的          m------model 操作数据库的 v------view视图                          t------template视图 c------controller控制逻辑             v------view控制逻辑 1.首先定义表及字段 在models.py中,然后在

hibernate动态创建数据库表名几种方式

数据库中数据量很大, 但又不可以删除时同时又要优化程序检索数据时间. 答:方式有很多比如 创建数据库表分区,创建索引, 存储过程等; 我这里采用动态创建数据库表的方式. 完全可以在不创建表分区情况下实行分表管理 例如 日志记录表 将日期(yyyy-MM)作为默认表后缀动态追加, 例如 文章发布表 将用户名作为后缀名进行动态追加 ; 动态创建数据库表的方式要具体问题具体分析, 比如JDBC中直接使用create table 表名_dynamicStr(...); 文章发布系统 dynamicStr

IE7中使用Jquery动态操作name问题

问题:IE7中无法使用Jquery动态操作页面元素的name属性. 在项目中有出现问题,某些客户的机器偶尔会有,后台取不到前台的数据值. 然开发和测试环境总是不能重现问题.坑爹之处就在于此,不能重现就不能调试,就不能知道改了后还会不会有这样的问题. 想想可能与客户环境唯一不同就只有可能是js缓存问题了,然后把所有的js文件引用的地方都加上一个当前时间参数,然问题依然存在. 本来规定的版本就是IE8,所以也没有想过会有版本兼容问题,在说了咱用的是jquery,jqeruy的出现不就是号称为了解决浏

Django中的app及mysql数据库篇(ORM操作)

Django常见命令 在Django的使用过程中需要使用命令让Django进行一些操作,例如创建Django项目.启动Django程序.创建新的APP.数据库迁移等. 创建Django项目 一把我们都新建一个文件夹来存放项目文件,切换到这个目录下,启动命令行工具.创建一个名为mysite的Django项目: django-admin startproject mysite 创建好项目之后,可以查看当前目录下多出一个名为mysite的文件夹,mysite的文件夹目录结构如下: mysite/ ma

java 动态操作数据库

问题描述:比如项目现在要使用在南京的8的区,这时这8个区分别建了一个数据库,但是只有一个项目,每个区的用户都使用这个项目进行登录 问题难点:如何验证登录人属于哪个区,然后确认之后,如何进行数据库的切换: 问题思路:除了8个数据库之外,在建一个数据库:数据库中包含的几张表:储存登录用户的信息等,直接上图理解 一.数据库的建立 h_right : h_role:红色表示登录人  所属哪一区 h_role_right:  分配显示的菜单 h_role_sysuser:用于分配区编号 h_sysuser

MySQL----DDL(操作数据库,表)

1. 操作数据库:CRUD 1. C(Create):创建 * 创建数据库: * create database 数据库名称; * 创建数据库,判断不存在,再创建: * create database if not exists 数据库名称; * 创建数据库,并指定字符集 * create database 数据库名称 character set 字符集名; * 练习: 创建db4数据库,判断是否存在,并制定字符集为gbk * create database if not exists db4

django中配置多个mongodb数据库

在Djnago中使用MongoDB数据库时,使用mongoengine模块.在settings中配置数据库连接如下: from mongoengine import connect connect('dbname1', host='127.0.0.1', port=27017) 其中的dbname1为要连接的mongodb数据库名字,host为mongodb数据库ip,port为相应的端口. 上面为单个数据库的配置,如果要配置多个数据库,一要在settings中增加数据库连接:二要在models

Android学习笔记:访问和添加通讯录中的联系人和联系人数据库表简介一

直接看代码,有详细注释. 1.联系人的数据库文件的位置 /data/data/com.android.providers.contacts/databases.contacts2.db 2.数据库中重要的几张表 contacts表:该表保存了所有的手机联系人,每个联系人占一行,该表保存了联系人的ContactID.联系次数.          最后一次联系的时间.是否含有号码.是否被添加到收藏夹等信息.可以与表的字段名相对应      理解. raw_contacts表:该表保存了所有创建过的手