zoukankan      html  css  js  c++  java
  • 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)  # 同步到数据库中
    
    
    

      

  • 相关阅读:
    IOS-小项目(饿了么 网络部分 简单实现)
    IOS 网络浅析-(十二 UIWebView简介)
    IOS 网络-深入浅出(一 )
    IOS 杂笔-11(实现在外部无法改变UIView的size)
    IOS 杂笔-12(类别de巧用 有便于Frame的操作)
    IOS 杂笔-13(appearance的巧妙使用)
    IOS 杂笔-14(被人遗忘的owner)
    IOS 杂笔-15(知识小点 readonly)
    IOS 日期的简洁格式展示
    Eclipse代码注释模板修改
  • 原文地址:https://www.cnblogs.com/randomlee/p/10737181.html
Copyright © 2011-2022 走看看