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

Django DRF如何自定义序列化器调整返回对象的JSON结构

解决方案

你只需要修改序列化器的字段定义,同时修正视图中序列化器的调用方式即可:

1. 修改序列化器代码

class StoreSerializer(serializers.ModelSerializer):
    # 顶层直接返回store_id字段
    store_id = serializers.IntegerField()
    # 自定义data字段存放last_update内容
    data = serializers.SerializerMethodField()

    def get_data(self, instance):
        return {
            "last_update": instance.last_update
        }

    class Meta:
        model = Store
        fields = ["store_id", "data"]

2. 修正视图代码(原有调用存在误用)

你当前是将模型实例序列化为JSON的输出场景,不需要传data参数,也不需要调用is_valid()校验方法,修改后代码如下:

class StoreViewSet(viewsets.ViewSet):
    serializer_class = StoreSerializer
    http_method_names = ['get', 'head']

    def list(self, request):
        try:
            query = Store.objects.all()
            # 直接传入查询集作为instance参数即可
            results = StoreSerializer(query, many = True)
            return Response(data = results.data, status = status.HTTP_200_OK)
        except Exception as E:
            return Response(data = str(E), status = status.HTTP_400_BAD_REQUEST)

原问题原因说明

  • 原序列化器只定义了store一个顶层字段,所有内容都被包裹在store字段内,不符合预期结构
  • 原视图中误用了序列化器的data参数,data参数仅用于接收前端传入内容做反序列化(写入数据)场景,读取数据直接传入模型实例即可。

内容的提问来源于stack exchange,提问作者xtlc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 01:15:03