水平分表
# Create your models here.
from django.db import models
# 得到表模型类
# name是表名,fields是字段,app_label是你的应用名(如:flow),module是应用下的模型(如:flow.models),options是元类选项
def create_model(name, fields=None, app_label='', module='', options=None):
class Meta: # 模型类的Meta类
pass
if app_label: # 必须在元类中设置app_label,相关属性可参考https://www.cnblogs.com/lcchuguo/p/4754485.html
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) # 创建模型类对象
return type(name, (models.Model,), attrs) #用type动态创建类
# 同步到数据库
def install(custom_model):
from django.db import connection
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
"""
fix:
editor = BaseDatabaseSchemaEditor(connection)
try:
editor.create_model(model=custom_model) # 会抛出个异常,不知为啥,但表会创建
except AttributeError as error:
print(error)
在BaseDatabaseSchemaEditor类中有一个__enter__方法,
需要通过with上下文打开以后deferred_sql变量才会在实例化后赋值给editor
这样就不会有'BaseDatabaseSchemaEditor' object has no attribute 'deferred_sql'
"""
with BaseDatabaseSchemaEditor(connection) as editor:
editor.create_model(model=custom_model)
def CreateNewTab(tabdate):
fields = {
"name": models.CharField(max_length=30),
"job_number": models.IntegerField(unique=True),
"even_shift": models.CharField(max_length=1024),
"administrator_shift": models.CharField(max_length=1024),
"middle_shift": models.CharField(max_length=1024),
"meeting_ops": models.CharField(max_length=1024),
"meeting_ops_manager": models.CharField(max_length=1024),
"checking_station": models.CharField(max_length=1024),
'__str__': lambda self: '%s %s %s %s %s %s %s %s' % (
self.name,
self.job_number,
self.even_shift,
self.administrator_shift,
self.middle_shift,
self.meeting_ops,
self.meeting_ops_manager,
self.checking_station,
), }
options = {'ordering': [
"name",
], 'verbose_name': 'valued customer', }
custom_model = create_model1(name=tabdate, fields=fields, options=options, app_label='ops_shift_',module='flow.models')
install(custom_model) # 同步到数据库中
# 判断表是否已经存在于数据库
def is_table_exit():
from django.db import connection
tables = connection.introspection.table_names()
if table_name in tables:
print("该表已经存在数据库中了")
return Response("该表已经存在数据库中了")
CreateNewTab(table_name) # 执行创建表