Python Django RF ErrorDetail:此字段是ApicClient所必需的

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):

我试图通过post请求创建一个带有序列化程序的对象,但在尝试将对象列表传递给嵌套序列化程序时出错。在以JSON格式传递
('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)
更新 问题仅在使用Django
python 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()的序列化程序字段 方法,以便显式指定子关系 应保存:

这些文件继续给出了一个示例,说明了您将如何实现这一点:


我还没有测试过这段代码,它可能不起作用,但它是直接从文档中获取的。

在使用APIClient
rest\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')