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
相关产品推荐
相关产品推荐

