嵌套反序列化失败 "This field is required"

Nested deserialisation fails with "This field is required"

我想用它的个人资料序列化一个嵌套的用户。 GET请求正常,但是POSTreturn出现如下错误: b'{"个人资料":["此字段为必填项。"]}'

但是 'profile' 是随我的请求一起发送的:

         {
            'username': 'username1',
            'password': '123456!',
            'first_name': 'name1',
            'last_name': '2',
            'email': 'test@mail.de',
            'profile': {
                'role': 3,
                'description': 'test'
            }
        }

我的序列化程序:

class ProfileSerializer(serializers.Serializer):

    role = serializers.ChoiceField(choices=Profile.ROLE_CHOICES, required=True)
    description = serializers.CharField(required=False, allow_blank=True, max_length=100)

    class Meta:
        model = Profile
        fields = ['description', 'role']


class UserSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    date_joined = serializers.DateTimeField(read_only=True)
    email = serializers.EmailField(required=True, allow_blank=False, max_length=100)
    first_name = serializers.CharField(required=True, allow_blank=False, max_length=100)
    last_name = serializers.CharField(required=True, allow_blank=False, max_length=100)
    username = serializers.CharField(required=True, allow_blank=False, max_length=100)
    first_name = serializers.CharField(required=True, allow_blank=False, max_length=100)
    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ['id', 'date_joined', 'email', 'first_name', 'last_name', 'username', 'profile']
        depth = 1

    def create(self, validated_data):
        print('todo')
        return user

我的post方法:

    def post(self, request, format=None):
        print(request.data)
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
          .....

其中 return 个:

<QueryDict: {'username': ['username1'], 'password': ['123456!'], 'first_name': ['name1'], 'last_name': ['2'], 'email': ['test@mail.ru'], 'is_active': ['True'], 'profile': ['role', 'description']}>
Bad Request: /api/user/
b'{"profile":["This field is required."]}'

你有什么技巧可以让它发挥作用吗?

问题是请求是作为 multipart/form 发送的。 反序列化仅在作为“application/json”

发送时有效

为了解决这个问题,我更改了我的测试用例以使用 DRF 提供的 APIClient:

from rest_framework.test import APIClient

client = APIClient()

在我的 settings.py 中,我在配置中添加了以下内容:

REST_FRAMEWORK = {
    ...
    'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}

以下是有关设置测试的更多信息:https://www.django-rest-framework.org/api-guide/testing/#setting-the-default-format