如何在类型验证前访问序列化器的字段数据?

问题描述 投票:2回答:1

如何在我的序列化器中访问序列化前的字段值(serializers.Serializer)或休息视图(UpdateAPIView)?

我有这样的东西。

class MySerializer(serializers.Serializer):
    my_field = serializers.IntegerField()

如果我试着用 "test "字符串填充我的字段, 它就会立即发出ValidationError告诉我数据类型错误(当然是期望一个整数). 在这个错误出现之前,我想捕捉这个值并对它做一些事情,但我不知道如何以及在哪里可以访问它。它到处都是一个空的字符串值。我试着在 is_valid() 呼叫前 super() 或与 raise_exception=False但我还是看不到它。

 '_kwargs': {'context': {'format': None,
                         'request': <rest_framework.request.Request object>,
                         'view': <rest.views.MyUpdateAPIView object>},
             'data': <QueryDict: {'my_field': ['']}>,
'initial_data': <QueryDict: {'my_field': ['']}>,

当我试图在我的视野中找到它时,我也看不到任何东西。

serializer.initial_data
<QueryDict: {'my_field': ['']}>

request.data
<QueryDict: {'my_field': ['']}>

当我试图检查 validate()validate_my_field() 方法,我甚至无法到达那里,因为我上面提到的ValidationError。

序列器验证到底是如何工作的?其中的顺序是什么,我如何在数据被 "清理 "之前访问数据?

python django django-rest-framework django-serializer
1个回答
0
投票

如果你想访问数据,你需要从请求中获取它。发送到api后台的数据可以在 request 对象。

例如在您看来

class MyFieldView(APIView):

     def create(self, request, *args, **kwargs):
         test_string = request.data['test'] # the name of the item sent to the api
         serializer = self.get_serializer(data=request.data)
         ....

所以你需要的是 request.data


0
投票

您可以使用 .to_internal_value() 方法来获取数据。

https:/www.django-rest-framework.orgapi-guideserializers#overriding-serialization-and-deserialization-behavior

代码exmaple。

def to_representation(self, instance):
    ret = super().to_representation(instance)
    print(ret['my_field'])
    return ret

0
投票

你可以覆盖de 启动 方法并改变数据对象。

    def __init__(self, instance=None, data=empty, **kwargs):
        self.instance = instance
        if data is not empty:
            self.initial_data = data
        self.partial = kwargs.pop('partial', False)
        self._context = kwargs.pop('context', {})
        kwargs.pop('many', None)
        super(BaseSerializer, self).__init__(**kwargs)

0
投票

你有没有试过扩展错误处理程序,看看这个。

https:/www.django-rest-framework.orgapi-guideexceptions

你可以获得数据,例如,记录它。

© www.soinside.com 2019 - 2024. All rights reserved.