因此,我在 django 中使用序列化器,并想在响应中更改字段名称,当我意识到我的更改没有被计算在内时,我做了一些挖掘,发现我的 validated_data 与我的数据不同。我的目标是将 python 对象提供给序列化程序,该序列化程序的字段与我要返回的名称不同,因此我在我的字段中使用了“source=”参数。请注意,更改 python 对象字段的名称不是一个选项。这是 python 对象:class Flow(object): """Just a regular python object""" def __init__(self, name=None, flow_uid=None, data_type=None, parent=None, container=None): """This has more fields than the serializer is waiting""" self._parent = None self._container = None self.name = name self.data_type = data_type self.flow_uid = flow_uid以及以下序列化器(我使用的是嵌套表示)serializers.pyfrom rest_framework.fields import CharField, IntegerField, ListField, JSONFieldfrom rest_framework.serializers import Serializerclass OutputSerializer(Serializer): uid = CharField(max_length=36) name = CharField(max_length=100) description = CharField(max_length=100)class FlowSerializer(Serializer): uid = CharField(source='flow_uid', max_length=36) # I want 'uid' in my response not 'flow_uid' name = CharField(max_length=100) data_type = CharField(max_length=100) class Meta: fields = '___all___' def to_representation(self, instance): instance = super(FlowSerializer, self).to_representation(instance) #Here instance = OrderedDict([('uid', 'uid_value'), ('name', 'name_value'), ('data_type', 'data_value')]) return instanceclass FlowOutputSerializer(OutputSerializer): columns = FlowSerializer(many=True)viewsets.pyclass AddTransformationViewSet(ViewSet): """Handle available "actions" for BrickModel operations""" def list(self, request, parent_lookup_analyses: str): """The method I call for this test""" flow1 = Flow(name="name1", flow_uid='flow_uid_value1', data_type='str') flow2 = Flow(name="name2", flow_uid='flow_uid_value2', data_type='str') flow1_ser = FlowSerializer(flow1) flow2_ser = FlowSerializer(flow2)
1 回答
LEATH
TA贡献1936条经验 获得超6个赞
在这种情况下使用 .data 而不是 .validated_data 有什么特别的危险吗?这种行为的原因是什么?
serializer.validated_data
旨在与 Python 对象一起使用。因此它会flow_uid
因为自定义source
值而暴露。
serializer.data
将是调用save()
after的序列化结果。save
因此,您应该始终serializer.data
在响应中使用并保留serializer.validated_data
与模型或内部项目代码交互的任何代码:
Response(data=dummy_serializer.data, status=status.HTTP_201_CREATED)
添加回答
举报
0/150
提交
取消