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)  # 同步到數據庫中
 
        

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM