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

验证数据字段不同于数据字段 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.py


from rest_framework.fields import CharField, IntegerField, ListField, JSONField

from rest_framework.serializers import Serializer


class 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 instance



class FlowOutputSerializer(OutputSerializer):

    columns = FlowSerializer(many=True)


viewsets.py


class 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贡献1669条经验 获得超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

添加回答

举报

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