gpt4 book ai didi

python - Django Rest Framework自定义ListSerializer仅返回字典键,而不返回值

转载 作者:太空宇宙 更新时间:2023-11-03 14:29:31 25 4
gpt4 key购买 nike

我正在使用自定义 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)

序列化器.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 结果):

{
"home": {
"label_color": "#123456",
"label_text": "young"
},
"speak": {
"label_color": "",
"label_text": "Hello"
}
}

我是自定义序列化器和使用 list_serializer_class 的新手;我可能只是不明白它们是如何工作的,但这种行为对我来说似乎确实出乎意料。

最佳答案

根据文档定义:ListSerializer 类提供同时序列化和验证多个对象的行为。如果您传递的数据可以表示为序列化器数据,那么您通常不需要 ListSerializers。如果您没有从模型实例获取键值,建议的解决方案是使用嵌套序列化器:

class ElementListSerializer(serializers.BaseSerializer):

def to_representation(self, obj):
return {
'home': {"label_color": "#123456",
"label_text": "young"},
'speak': {
"label_color": "",
"label_text": "Hello"}
}

class ElementSerializer(serializers.ModelSerializer):

element_list = ElementListSerializer()

class Meta:
model = Element

def create(self, validated_data):
data = validated_data.pop('element_list')
return data

关于python - Django Rest Framework自定义ListSerializer仅返回字典键,而不返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47397759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com