如何序列化model8模型以获得指定嵌套结构的JSON输出
假设你使用的是Django REST Framework(DRF)做序列化,有两种常用实现方式:
方式1:用SerializerMethodField自定义输出字段
先定义通用的嵌套图片结构序列化器,再在主序列化器中分别处理a、b两类图片的输出逻辑:
from rest_framework import serializers from .models import model8 # 嵌套的图片+URL结构序列化器 class ImageItemSerializer(serializers.Serializer): image = serializers.ImageField() url = serializers.CharField() class Model8Serializer(serializers.ModelSerializer): a_images = serializers.SerializerMethodField() b_images = serializers.SerializerMethodField() class Meta: model = model8 # 需要返回country字段的话可以自己加到fields列表里 fields = ["a_images", "b_images"] def get_a_images(self, obj): # 如果你需要的a_images数组元素数量不同,直接调整返回的列表即可 # 这里对齐你给的输出示例,写了两个元素,你可以按需修改 return [ {"image": obj.a_image.url if obj.a_image else "", "url": obj.a_url}, {"image": "", "url": ""} ] def get_b_images(self, obj): return [ {"image": obj.b_image.url if obj.b_image else "", "url": obj.b_url}, {"image": "", "url": ""} ]
使用的时候如果需要ImageField返回带域名的完整访问路径,实例化序列化器时要传入request上下文:
# 视图中调用示例 serializer = Model8Serializer(model8_instance, context={"request": request})
方式2:重写to_representation方法修改输出结构
如果你不想额外定义太多序列化器字段,也可以直接重写序列化器的输出转换方法:
class Model8Serializer(serializers.ModelSerializer): class Meta: model = model8 fields = ["a_image", "a_url", "b_image", "b_url"] def to_representation(self, instance): raw_data = super().to_representation(instance) return { "a_images": [ {"image": raw_data.get("a_image", ""), "url": raw_data.get("a_url", "")}, {"image": "", "url": ""} ], "b_images": [ {"image": raw_data.get("b_image", ""), "url": raw_data.get("b_url", "")}, {"image": "", "url": ""} ] }
两种方式都能实现你要的输出格式,如果你后续需要复用ImageItemSerializer的结构,选第一种更合适;如果只是单次修改输出格式,第二种更简洁。
内容的提问来源于stack exchange,提问作者Sr coder
相关产品推荐
相关产品推荐

