首页 > 其他分享 >django动态创建表和动态选择实体

django动态创建表和动态选择实体

时间:2023-08-01 19:57:21浏览次数:28  
标签:TestBlock testBlock 实体 db 动态创建 django ID BLOCK NAME

开发有时需要动态创建表,创建完成后需要动态选择model对应的表,该需求如何实现

1、model层   TestBlock为了动态创建表、getBlockModel为了动态选择表

from django.db import models

# Create your models here.
class TestBlock(models.Model):
    BLOCK_ID = models.CharField(max_length=40,primary_key=True, verbose_name='对象ID')
    BLOCK_NAME = models.CharField(max_length=200, verbose_name='姓名')
    class Meta:
        db_table = 'TEST_BLOCK_T'


def getBlockModel(table_name):
    class MyCLass(models.Model):
        BLOCK_ID = models.CharField(max_length=40, primary_key=True, verbose_name='对象ID')
        BLOCK_NAME = models.CharField(max_length=200, verbose_name='姓名')
        class Meta:
            db_table = table_name
    return MyCLass

2、url

from django.urls import path


from . import views

urlpatterns = [
      path('autoCreate', views.createTest),
      path('autoSelect', views.selectTest),
]

 3、view层createTest方法  重点的地方 注意红色地方,注释掉可以动态创建表,但是如果不注释掉,动态变更实体对应的数据表在使用它,就会报错

ERROR:django.db.utils.OperationalError: (1054, "Unknown column 'TEST_BLOCK_T_1.BLOCK_ID' in 'where clause'")

分别注释 #-------------1-begin-------------------------- 和 # -------------2-begin--------------------------之间的代码,执行代码动态创建两个表并把数据插入进去。

from django.shortcuts import render

# Create your views here.
from .models import *
from django.http import HttpResponse
from django.db import connection

from django.db.backends.base.schema import BaseDatabaseSchemaEditor


def createTest(request):
    #-------------1-begin--------------------------
    TestBlock._meta.db_table = 'TEST_BLOCK_T_' + '1'
    # #创建分表
    cursor = connection.cursor()
    editor = BaseDatabaseSchemaEditor(connection)
    with BaseDatabaseSchemaEditor(connection) as editor:
        editor.create_model(model=TestBlock)
    # testBlock = TestBlock()
    # testBlock.BLOCK_ID = '1'
    # testBlock.BLOCK_NAME = 'oracle'
    # testBlock.save()
    # -------------1-end--------------------------

    # -------------2-begin--------------------------
    TestBlock._meta.db_table = 'TEST_BLOCK_T_' + '2'
    # #创建分表
    cursor = connection.cursor()
    editor = BaseDatabaseSchemaEditor(connection)
    with BaseDatabaseSchemaEditor(connection) as editor:
        editor.create_model(model=TestBlock)

    # testBlock1 = TestBlock()
    # testBlock1.BLOCK_ID = '2'
    # testBlock1.BLOCK_NAME = 'mysql'
    # testBlock1.save()
    # -------------2-end--------------------------
    return HttpResponse("yc is a good man")


 4、view层selectTest方法  动态选择实体对应的表

def selectTest(request):
    TestBlock = getBlockModel('TEST_BLOCK_T_' + '1')
    testBlocks = TestBlock.objects.all()
    for testBlock in testBlocks:
        print('1---testBlock.BLOCK_ID:'+testBlock.BLOCK_ID)
        print('1---testBlock.BLOCK_NAME:'+testBlock.BLOCK_NAME)

    TestBlock = getBlockModel('TEST_BLOCK_T_' + '2')
    testBlocks = TestBlock.objects.all()
    for testBlock in testBlocks:
        print('2---testBlock.BLOCK_ID:'+testBlock.BLOCK_ID)
        print('2---testBlock.BLOCK_NAME:'+testBlock.BLOCK_NAME)
    return HttpResponse("yc is a good man")

 数据结果:

1---testBlock.BLOCK_ID:1
1---testBlock.BLOCK_NAME:oracle
2---testBlock.BLOCK_ID:2
2---testBlock.BLOCK_NAME:mysql

结论是 TestBlock._meta.db_table = 'TEST_BLOCK_T_' + '1'可以动态创建表,而动态选择表只能用TestBlock = getBlockModel('TEST_BLOCK_T_' + '1') 这样的方式。

 

标签:TestBlock,testBlock,实体,db,动态创建,django,ID,BLOCK,NAME
From: https://www.cnblogs.com/yclh/p/17598924.html

相关文章

  • Python基础day56 Django视图层相关
    视图层三板斧问题在视图函数中写函数跟普通函数不太一样,Django中使用的是局部的request所有的视图函数不能够没有返回值,并且返回值还必须是HttpResponse对象#错误代码Theviewapp01.views.indexdidn'treturnanHttpResponseobject.ItreturnedNoneinstead.其实我......
  • 渗透-01:DNS原理和HTML字符编码-HTML实体编码
    一、DNS概念DNS(DomainNameSystem的缩写)就是根据域名查出IP地址(常用)DNS分类:正向解析:已知域名解析IP反向解析:已知IP解析对应的域名二、查询过程工具软件dig可以显示整个查询过程[root@node01~]#digbaidu.com;<<>>DiG9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13<<......
  • Python-Django-Django视图和URL
    Python-Django学习目录:环境搭建和基础知识:包括安装Python和Django、了解Python基础语法、掌握Django框架的基本概念和工作原理等。模型和数据库:包括创建模型、定义字段、使用DjangoORM进行数据库操作等。视图和URL:包括定义视图函数、URL路由配置、模板渲染等。表单和验证:包括表单......
  • 结合前端实现ORM对数据的增删改查、动静态网页,Django创建表关系、请求生命周期流程图
    通过结合前端页面实现ORM对数据的增删改查写一个页面,把数据库中的数据以表格的形式展示出来,然后在每一行的后面加两个按钮,分别是修改、删除的按钮。1.先创建一张UserInfo表格:在Django中没有提供tinyint、smallint,就只提供了int和bigint,如果想要写其他类型,需要自己定义......
  • django 简单文件上传
    通过模型来处理上传的文件¶如果想要在 FileField 上的 Model 保存文件,使用 ModelForm 会让这一过程变得简单。当调用 form.save() 时,文件对象将会被保存在对相应 FileField 的 upload_to 参数所指定的地方:fromdjango.httpimportHttpResponseRedirectfromdja......
  • Django 动态操作model
    fromdjango.appsimportappsforoinoids_result:oid_result=snmp.snmpWalk(o.oid)ifo.model_filed_nameandlen(o.model_filed_name)>0:field_name=o.model_filed_name.get('field_......
  • 通过局域网访问连接 vite 或 Django 之类的项目
    博客地址:https://www.cnblogs.com/zylyehuo/step1将vite或Django类的项目启动ip设置为0.0.0.0:端口step2查询本机电脑在当前局域网下的ipstep3将跳转路径改为查询到的本机ip,再加上第一步中设置的前端端口......
  • Python基础day56 Django URL分组设置
    URL函数的使用(支持正则表达式)#django1中使用的是urlurl('test',views.test),url函数的第一个参数是支持正则表达式的如果匹配到一个路由,就不在往下匹配,直接执行路由对应的视图函数#http://127.0.0.1:8000/test/是django默认设置的,django会先拿着test去匹配,如果匹配不......
  • URL函数的使用(支持正则表达式)、分组、反向解析、Django2的转换器、路由分发、伪静态的
    url('test',views.test),url函数的第一个参数是支持正则表达式的如果匹配到一个路由,就不在往下匹配,直接执行路由对应的视图函数 http://127.0.0.1:8000/test/是django默认设置的,django会先拿着test去匹配,如果匹配不到,它会自动加一个斜杠再次去匹配 去浏览器器搜索textadd只......
  • django orm 使用关联字段查询和更新
    关联字段查询_exam_fields=['add_datetime','times','start_date','end_date','uuid','name','img','duration','bx_duration']_alias_......