因此,我在 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條經驗 獲得超7個贊
在這種情況下使用 .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
提交
取消