You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何序列化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:06:03