96 lines
3.8 KiB
Python
96 lines
3.8 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) |