2025-03-18 08:46:50 +08:00

96 lines
3.9 KiB
Python

#!/bin/python
#coding: utf-8
# +-------------------------------------------------------------------
# | version:1.2
# +-------------------------------------------------------------------
# | django-vue-lyadmin 专业版
# +-------------------------------------------------------------------
# | Author: lybbn
# +-------------------------------------------------------------------
# | QQ: 1042594286
# +-------------------------------------------------------------------
# | EditDate: 2024-01-04
# +-------------------------------------------------------------------
# ------------------------------
# 代码生成--serializer
# ------------------------------
from django.template import Template,Context
from utils.models import get_all_models_objects
from utils.common import ast_convert
def lyGenerateSerializer(object):
#自定义SerializerMethodField
ForeignKeyList = []
representation = []
column = object['column']
for c in column:
field_name = c['field_name']
foreign_key = c['foreign_key']
field_type = c['field_type']
form_type = c['form_type']
if form_type == 'checkbox':
f_data = f"""ret['{field_name}'] = ast_convert(ret['{field_name}'])"""
representation.append(f_data)
if field_type in ['ForeignKey','OneToOneField','ManyToManyField']:
f_class_name = foreign_key['class_name']
f_value = foreign_key['value']
f_label = foreign_key['label']
f_field_list = foreign_key.get('field_list',None)
if f_class_name and f_value and f_label:
gname = "%s_lyautocode_name"%field_name
if field_type in ['ForeignKey','OneToOneField']:
if f_field_list:
f_field_list_field = f_field_list.split(',')
f_field_list_field_data = {}
for fl in f_field_list_field:
f_field_list_field_data[fl] = f"""obj.{field_name}.{fl}"""
s_data = f"""{gname}=serializers.SerializerMethodField(read_only=True)
def get_{gname}(self,obj):
if obj.{field_name}_{f_value}:
data = {f_field_list_field_data}
for d in data:
data[d] = eval(data[d])
return data
return ''
"""
else:
s_data = f"""{gname}=serializers.SerializerMethodField(read_only=True)
def get_{gname}(self,obj):
if obj.{field_name}_{f_value}:
return obj.{field_name}.{f_label}
return ''
"""
ForeignKeyList.append(s_data)
else:#ManyToManyField 默认返回顿号分割的值
s_data = f"""{gname}=serializers.SerializerMethodField(read_only=True)
def get_{gname}(self,obj):
return ''.join([related.{f_label} for related in obj.{field_name}.all()])
"""
ForeignKeyList.append(s_data)
serializer_code = """# -*- coding: utf-8 -*-
from rest_framework import serializers
from apps.lyautocode.models.models_{{object.class_name}} import {{ object.class_name }}
from utils.serializers import CustomModelSerializer
from utils.common import ast_convert
class {{ object.class_name }}Serializer(CustomModelSerializer):
\"\"\"
{{ object.verbose_name }} 序列化器
\"\"\"{% for f in ForeignKeyList %}
{{ f|safe }}{% endfor %}{% if representation %}
def to_representation(self, instance):
ret = super().to_representation(instance){% for r in representation %}
{{ r|safe }}{% endfor %}
return ret
{% endif %}
class Meta:
model = {{ object.class_name}}
read_only_fields = ["id"]
fields = '__all__'
"""
context = Context({'object': object,'ForeignKeyList':ForeignKeyList,'representation':representation})
return Template(serializer_code).render(context)