为了账号安全,请及时绑定邮箱和手机立即绑定

验证数据字段不同于数据字段 Django Rest 嵌套序列化程序

验证数据字段不同于数据字段 Django Rest 嵌套序列化程序

qq_笑_17 2023-01-04 16:44:36
因此,我在 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)


查看完整回答
反对 回复 2023-01-04
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信