189 lines
8.1 KiB
Python
189 lines
8.1 KiB
Python
#!/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
|
||
|