如何在我的序列化器中访问序列化前的字段值(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。
序列器验证到底是如何工作的?其中的顺序是什么,我如何在数据被 "清理 "之前访问数据?
如果你想访问数据,你需要从请求中获取它。发送到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
您可以使用 .to_internal_value()
方法来获取数据。
代码exmaple。
def to_representation(self, instance):
ret = super().to_representation(instance)
print(ret['my_field'])
return ret
你可以覆盖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)