#!/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): # object ={ # "id": 1, # "modifier_name": "超级管理员", # "creator_name": "超级管理员", # "create_datetime": "2023-02-14 00:09:35", # "update_datetime": "2023-02-16 20:59:42", # "modifier": "456b688c-8ad5-46de-bc2e-d41d8047bd42", # "is_delete": False, # "verbose_name": "学生管理", # "class_name": "StudentManage", # "db_table": "t_student", # "column": [ # { # "field_name": "name", # "verbose_name": "姓名", # "field_type": "CharField", # "nullable": True, # "unique": False, # "can_edit": True, # "can_list": True, # "can_search": False, # "form_type": "input", # "width": "100", # "hide": False, # "sortable": False, # "fixed": False, # "filters": [], # "dic_type": "", # "max_length": "50" # }, # ], # "remark": "学生管理字段", # "creator": "456b688c-8ad5-46de-bc2e-d41d8047bd42" # } if not object: raise ValueError("传递参数错误") if object['class_name'] in ["LyAutoCode","autocode"]: raise ValueError("models类名:%s已被系统暂用,请更换其他类名"%object['class_name']) if object['db_table'] in ["lyadmin_autocode"]: raise ValueError("数据表名:%s已被系统暂用,请更换其他表名"%object['db_table']) column = object['column'] model_column = [] custom_ordering = ['-create_datetime'] ordering = [] import_extend = [] for c in column: 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',False) db_index = c.get('db_index',False) nullable = c['nullable'] 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['class_name'].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['class_name'].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 -*- from django.db import models from utils.models import CoreModel,BaseModel,SimpleCoreModel{% for i in import_extend %} {{i}}{% endfor %} class {{object.class_name}}(CoreModel): \"\"\" {{ object.verbose_name }} \"\"\"{% for c in model_column %} {{ c|safe }}{% endfor %} class Meta: db_table = \"{{ object.db_table}}\" verbose_name = \"{{ object.verbose_name }}\" verbose_name_plural = verbose_name ordering = {{ ordering | safe }} app_label = 'lyautocode'#不放在lyautocode的app中此配置项可去掉 """ context = Context({'model_column':model_column,'import_extend':import_extend,'object':object,'ordering':ordering}) data = Template(model_code).render(context) return data