Python Django RF ErrorDetail:此字段是ApicClient所必需的
我试图通过post请求创建一个带有序列化程序的对象,但在尝试将对象列表传递给嵌套序列化程序时出错。在以JSON格式传递Python Django RF ErrorDetail:此字段是ApicClient所必需的,python,django,django-rest-framework,Python,Django,Django Rest Framework,我试图通过post请求创建一个带有序列化程序的对象,但在尝试将对象列表传递给嵌套序列化程序时出错。在以JSON格式传递('id'、'name'、'description')数据时,如果条列表未正确解析,则返回以下错误: {'bar':[ErrorDetail(string='This field is required',code='required')]} 这些是序列化程序: class BarsSerializer(serializers.ModelSerializer):
('id'、'name'、'description')
数据时,如果条列表未正确解析,则返回以下错误:
{'bar':[ErrorDetail(string='This field is required',code='required')]}
这些是序列化程序:
class BarsSerializer(serializers.ModelSerializer):
class Meta:
model = Bar
fields = ('name', 'foo')
class FooSerializer(serializers.ModelSerializer):
bars = BarsSerializer(many=True)
class Meta:
model = Foo
fields = ('id', 'author' 'name', 'description', 'bars')
def create(self, validated_data):
validated_data['author'] = self.context['request'].user
# Foo object manager is tested and works
return Foo.objects.create(**validated_data)
这是我的请求负载:
{
'name': "A Foo",
'description': "A happy foo running in the woods of Central Park",
'bars': [
{name : 'a'},
{name : 'b'},
{name : 'c'},
]
}
这些是模型
class Bar(models.Model):
name = models.CharField(
max_length=255,
default=""
)
foo = models.ForeignKey(
Foo,
related_name='foos',
on_delete=models.CASCADE
)
class Foo(models.Model):
name = models.CharField(
max_length=255
)
description = models.CharField(
max_length=1023,
default=""
)
author = models.ForeignKey(CommonUser, on_delete=models.SET_NULL, null=True)
更新
问题仅在使用Djangopython manage.py test进行测试时存在,而在使用本地服务器的postman测试请求时不存在
data = {
"name": "A Foo",
"description": "A happy foo running in the woods of Central Park",
"bars": [
{name : "a"},
{name : "b"},
{name : "c"},
]
}
res = self.client_one.post(reverse('foo-list'), data)
请注意,Foo和Bar都是我真实模型的简化模型,以减少给定问题的信息量我认为我在
可写嵌套序列化程序
默认情况下,嵌套序列化程序是只读的。如果要支持对嵌套对象的写入操作
需要创建create()和/或update()的序列化程序字段
方法,以便显式指定子关系
应保存:
这些文件继续给出了一个示例,说明了您将如何实现这一点:
我还没有测试过这段代码,它可能不起作用,但它是直接从文档中获取的。在使用APIClientrest\u framework.test.APIClient测试模型时,以及使用更复杂的数据和嵌套序列化程序发出post请求时,格式必须明确设置为json
def test_a_feature(self):
self.client = APIClient()
payload = {
"name": "A Foo",
"description": "A happy foo running in the woods of Central Park",
"bars": [
{name : "a"},
{name : "b"},
{name : "c"},
]
}
self.client.post(reverse('foo-list'), payload, format='json')
您能否举例说明BarSerializer
的外观,以及您在models.py
中的Foo
和Bar
模型,因为您使用的是serializer.ModelSerializer
?我想你可能在条码
模型的序列化方式上有错误。我已经添加了模型和条码序列化程序,如果有帮助的话。我已经测试了这些更改,但遗憾的是它没有解决我的问题,在测试时这似乎是一个问题。因此,请澄清一下,即使在这些更改之后,同样的错误仍然存在?是的,但我最终设法找到了解决方案,这是因为请求是在我测试请求时发出的,我需要将APLIClient格式设置为json
class BarsSerializer(serializers.ModelSerializer):
class Meta:
model = Bar
fields = ['name'] # Note that I have removed the 'foo' field since I have re-written your create method in the FooSerializer.
class FooSerializer(serializers.ModelSerializer):
bars = BarsSerializer(many=True)
class Meta:
model = Foo
fields = ['id', 'author', 'name', 'description', 'bars']
def create(self, validated_data):
validated_data['author'] = self.context['request'].user
bars_data = validated_data.pop('bars') # Validated data is your dict with the 'bars' list nested inside it
Foo = Foo.objects.create(**validated_data) # Foo object manager is tested and works
# Now we just iterate over the bars list...
for bar_data in bars_data:
#... and create a bar for each bar_data
Bar.objects.create(foo=foo, **bar_data)
return Foo
def test_a_feature(self):
self.client = APIClient()
payload = {
"name": "A Foo",
"description": "A happy foo running in the woods of Central Park",
"bars": [
{name : "a"},
{name : "b"},
{name : "c"},
]
}
self.client.post(reverse('foo-list'), payload, format='json')