验证时序列化器字段“源”参数不起作用

rho*_*ard 5 python django django-rest-framework

为什么在尝试验证数据时“来源”不起作用?

from rest_framework import serializers

class Test(serializers.Serializer):
    my_field = serializers.CharField(source='myField')
    
test_data = {'myField': 'test1', 'myOtherField': 'test2'}

Test(test_data).data
Run Code Online (Sandbox Code Playgroud)

输出:{'my_field':'test1'}。

Test(test_data).is_valid(raise_exception=True)
Run Code Online (Sandbox Code Playgroud)

输出:AssertionError:无法调用,.is_valid()因为data=在实例化序列化器实例时未传递关键字参数。

Test(data=test_data).is_valid(raise_exception=True)
Run Code Online (Sandbox Code Playgroud)

输出: ValidationError: {'my_field': [ErrorDetail(string='此字段为必填项。', code='required')]}

Ami*_*Ali 4

实际上,您应该设置 myField 而不是序列化器字段,并将 source 设置为 my_field (您希望字段具有的名称)。

我在这里给你举了一个例子:


在序列化器.py 中:

from rest_framework import serializers

class TestSerializer(serializers.Serializer):
    TestField = serializers.CharField(source="test_field")
Run Code Online (Sandbox Code Playgroud)

在views.py中:

from rest_framework.views import APIView, Response
from .serializers import TestSerializer

class TestView(APIView):
    def get(self, request):
        test_data = {"TestField": "This is a test value"}
        
        serializer = TestSerializer(data=test_data)
        serializer.is_valid(raise_exception=True)

        print(serializer.validated_data)
        return Response(serializer.validated_data)
Run Code Online (Sandbox Code Playgroud)

该序列化器的输出是:

>>> OrderedDict([('test_field', 'This is a test value')])
Run Code Online (Sandbox Code Playgroud)
有关源属性的更多信息:https://www.django-rest-framework.org/api-guide/fields/#source