#!/bin/python #coding: utf-8 # +------------------------------------------------------------------- # | version:1.3 # +------------------------------------------------------------------- # | Date: 2023-10-31 # +------------------------------------------------------------------- # | django-vue-lyadmin # +------------------------------------------------------------------- # | Author: lybbn # +------------------------------------------------------------------- # | QQ: 1042594286 # +------------------------------------------------------------------- # | EditDate: 2024-01-05 # +------------------------------------------------------------------- # ------------------------------ # 代码生成--models模型 # ------------------------------ from django.template import Template,Context from utils.models import get_all_models_objects def lyGenerateModels(object): # { # "widgetList": [ # { # "key": 47181, # "type": "input", # "icon": "lyicon-text-field", # "formItemFlag": true, # "displayName": "单行输入", # "options": { # "name": "input8200612", # "isFormField": true, # "crudField": { # "field_name": "input8200612", # "verbose_name": "测试", # "field_type": "CharField", # "foreign_key": { # "class_name": "Users", # "on_delete": "", # "label" :'',//显示 # "value":'id',//主键 # "api_path":'',//前端api的去除api前缀的地址 # }, # "max_length": "100", # "default": "200", # "nullable": true, # "unique": true, # "can_edit": true, # "edit_disabled":false,//编辑时禁用 # "can_list": true, # "can_search": true, # "can_export":false,//该字段是否可导出(导出功能使用) # "search_type": "icontains", # "width": 100, # "db_index": true # }, # "label": "测试", # "labelAlign": "", # "type": "text", # "defaultValue": "", # "placeholder": "", # "columnWidth": "200px", # "size": "", # "labelWidth": "", # "labelHidden": false, # "readonly": false, # "disabled": false, # "hidden": false, # "clearable": true, # "showPassword": false, # "required": false, # "requiredHint": "", # "validation": "", # "validationHint": "", # "customClass": [], # "minLength": null, # "maxLength": null, # "showWordLimit": false, # "prefixIcon": "", # "suffixIcon": "", # "prependSlot": "", # "appendSlot": "", # "onInput": "", # "onChange": "", # "onFocus": "", # "onBlur": "" # }, # "id": "input82006" # } # ], # "formConfig": { # "modelName": "formData", # "refName": "lyFormBuilder", # "rulesName": "rules", # "modelDbTable": "tb_testmanage", # "modelClassName": "classnnn", # "modelVerboseName": "测试zz", # "labelWidth": "auto", # "labelPosition": "left", # "size": "", # "disabled": false, # "cssCode": "", # "customClass": "", # "functions": "", # "jsonVersion": 1, # "onFormMounted": "" # } # } if not object: raise ValueError("传递参数错误") if object['formConfig']['modelClassName'] in ["lyformbuilder","lyFormBuilder"]: raise ValueError("models类名:%s已被系统暂用,请更换其他类名"%object['formConfig']['modelClassName']) if object['formConfig']['modelDbTable'] in ["lyadmin_lyformbuilder","lyadmin_lyFormBuilder"]: raise ValueError("数据表名:%s已被系统暂用,请更换其他表名"%object['formConfig']['modelDbTable']) column = object['widgetList'] model_column = [] custom_ordering = ['-create_datetime'] ordering = [] import_extend = [] for t in column: c = t['options']['crudField'] field_name = c['field_name'] field_type = c['field_type'] if c['field_type'] else "CharField" foreign_key = c['foreign_key'] verbose_name = c['verbose_name'] max_length = c.get('max_length') default = c.get('default') unique = c['unique'] primary_key = c.get('primary_key') nullable = c['nullable'] db_index = c['db_index'] codeline = field_name +" = models."+field_type+"(" if field_type == 'ForeignKey' or field_type == 'ManyToManyField' or field_type == 'OneToOneField': f_class_name = foreign_key['class_name'] if not foreign_key or not f_class_name: raise ValueError("%s没有设置外键项,请设置后重试"%field_name) on_delete_item = foreign_key['on_delete'] if f_class_name == 'self': f_class_name = "\'self\'" else: extend_import_path = get_all_models_objects(foreign_key['class_name']) if not extend_import_path: raise ValueError("%s没有找到该类的导入路径"%foreign_key['class_name']) import_extend.append(extend_import_path['table']['import_path']) on_delete_item = on_delete_item if on_delete_item else "CASCADE" if field_type == 'ManyToManyField': on_delete_item_str = "" else: on_delete_item_str = ", on_delete=models." + on_delete_item if f_class_name == "Users": related_name= "lyauto_"+object['formConfig']['modelClassName'].lower()+"_"+field_name.lower()+"_user" codeline += f_class_name + on_delete_item_str +", related_name=\""+related_name+ "\", db_constraint=False, verbose_name=\"" + verbose_name + "\"" else: if field_type == 'ForeignKey':#ForeignKey 判断关联了多个同一个外键时需要添加related_name same_ForeignKey_keywords = "ForeignKey("+f_class_name+"," has_same_ForeignKey = [item for item in model_column if same_ForeignKey_keywords in item] if has_same_ForeignKey: related_name= "lyauto_"+object['formConfig']['modelClassName'].lower()+"_"+field_name.lower() codeline += f_class_name + on_delete_item_str +", related_name=\""+related_name+ "\", db_constraint=False, verbose_name=\"" + verbose_name + "\"" else: codeline += f_class_name + on_delete_item_str + ", db_constraint=False, verbose_name=\"" + verbose_name + "\"" else: codeline += f_class_name + on_delete_item_str + ", db_constraint=False, verbose_name=\"" + verbose_name + "\"" else: codeline += "verbose_name=\""+verbose_name+"\"" if field_type == 'CharField': if not max_length: max_length = "100" codeline += ", max_length="+max_length elif field_type == 'BooleanField': codeline += f", default={default}" elif field_type == 'DecimalField': codeline += " , max_digits=10, decimal_places=2" if db_index: codeline += ", db_index=True" if primary_key: codeline += ", primary_key=True" else: if field_type in ['AutoField']: codeline += ", primary_key=True" if unique: codeline += ", unique=True" isnullable="" blank="" if nullable: isnullable="True" blank="True" if field_type not in ['ManyToManyField']: codeline += ", null=" + isnullable + ",blank=" + blank else: codeline += ",blank=" + blank else: isnullable="False" blank="False" if default is not None: if 'default=' not in codeline and field_type not in ['ManyToManyField']: if default == "": codeline += f",default=''" else: if field_type in ['IntegerField','SmallIntegerField','PositiveIntegerField','PositiveSmallIntegerField','FloatField']: codeline += f",default={default}" else: codeline += f",default='{default}'" codeline += ")" model_column.append(codeline) # if c['sortable']: # ordering.append(c['field_name']) # ordering.append("-%s"%(c['field_name'])) ordering = ordering + custom_ordering model_code = """# -*- coding: utf-8 -*- #此文件请放在lyFormBuilder的models目录中 from django.db import models from utils.models import CoreModel,BaseModel,SimpleCoreModel{% for i in import_extend %} {{i}}{% endfor %} class {{object.formConfig.modelClassName}}(CoreModel): \"\"\" {{ object.formConfig.modelVerboseName }} \"\"\"{% for c in model_column %} {{ c|safe }}{% endfor %} class Meta: db_table = \"{{ object.formConfig.modelDbTable}}\" verbose_name = \"{{ object.formConfig.modelVerboseName }}\" verbose_name_plural = verbose_name ordering = {{ ordering | safe }} app_label = 'lyFormBuilder'#不放在lyFormBuilder的app中此配置项可去掉 """ context = Context({'model_column':model_column,'import_extend':import_extend,'object':object,'ordering':ordering}) data = Template(model_code).render(context) return data