Django 动态建表
# Create your models here. from django.db import models # name是表名,fields是字段,app_label是你的应用名(如:flow),module是应用下的模型(如:flow.models),options是元类选项 def create_model1(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", "job_number", "even_shift", "administrator_shift", "middle_shift", "meeting_ops", "meeting_ops_manager", "checking_station", ], 'verbose_name': 'valued customer', } custom_model = create_model1(name=tabdate, fields=fields, options=options, app_label='ops_shift_', module='flow.models') install(custom_model) # 同步到数据库中