2025-03-17 18:06:54 +08:00

189 lines
7.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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