【发布时间】:2018-05-04 00:16:19
【问题描述】:
我正在使用自定义 ListSerializer 重新格式化 JSON 响应,当我从序列化器内部登录时它会生成正确的格式,但是当它返回到 ViewSet 时,响应变成字典键列表而不是包含包含键和值的整个字典。
我用硬编码的 JSON 做了一个简化的例子来说明我认为问题的症结所在。
views.py
class ElementViewSet(viewsets.ViewSet):
...
@detail_route(methods=['get'])
def elements(self, request, pk=None):
elements = ElementFilterSet(params)
serializer = serializers.ElementSerializer(elements, many=True)
return Response(serializer.data)
serializers.py
class ElementListSerializer(serializers.ListSerializer):
def to_representation(self, obj):
result = {"home": {"label_color": "#123456","label_text": "young"},"speak": { "label_color": "","label_text": "Hello"}}
return result
class ElementSerializer(serializers.ModelSerializer):
class Meta:
model = Element
list_serializer_class = ElementListSerializer
def to_representation(self, obj):
result = super(ElementSerializer, self).to_representation(obj)
return result
我得到的响应是一个字典键列表:
[
"speak",
"home"
]
而不是我想要的,它是整个字典(在这种情况下,只是硬编码的 JSON result):
{
"home": {
"label_color": "#123456",
"label_text": "young"
},
"speak": {
"label_color": "",
"label_text": "Hello"
}
}
我是自定义序列化程序和使用list_serializer_class 的新手;我可能根本不明白它们是如何工作的,但这种行为对我来说确实是出乎意料的。
【问题讨论】:
-
ListSerializer可能将其数据视为可迭代的,并且迭代dict会产生其键。 -
ListSerializer不应该是实际序列化数据的对象,这就是ElementSerializer的用途。ListSerializer允许您在创建或更新对象时自定义行为。 django-rest-framework.org/api-guide/serializers/#listserializer -
谢谢@themanatuf;您的回复使我重新构建了我的代码,以便我不使用
ListSerializer,而是在视图后序列化中重新格式化 JSON 响应。查看相关问题:stackoverflow.com/questions/47370007/…
标签: python json django django-rest-framework