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