嵌套反序列化失败 "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
我想用它的个人资料序列化一个嵌套的用户。 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