KeyError + POST + Django Rest 框架

Eli*_*son 4 python-3.x django-rest-framework

我是 Django Rest Framework 的新手,当我想发布数据时,我在 /api/ 'folder'收到此错误KeyError
这是我的代码:
在我的 models.py 中

class Folder(models.Model):
    name = models.CharField(max_length=200)

def __str__(self):
    return self.name

class Todo(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    folder = models.ForeignKey('Folder', related_name='todos', on_delete=models.CASCADE)

    def __str__(self):
        return self.title
Run Code Online (Sandbox Code Playgroud)

在我的 serializers.py

class FolderSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('id','name',)
        model = models.Folder
        extra_kwargs = {
            "id":{
                "required":False, 
                "read_only":False
                }
            }

class TodoSerializer(serializers.ModelSerializer):
    folder = FolderSerializer(read_only=True, required=False)
    class Meta:
        fields = ('id','title','description','folder',)
        model = models.Todo

    def create(self, validated_data):
        # Get our folder
        folder_data = validated_data.pop('folder')
        # Create our todo
        todo = models.Todo.objects.create(**validated_data)
        for data in folder_data:
            models.Folder.objects.create(todo=todo, **data)
        return todo
Run Code Online (Sandbox Code Playgroud)

在我的 views.py 中

class  ListTodo(generics.ListCreateAPIView):
    queryset = models.Todo.objects.all()
    serializer_class = serializers.TodoSerializer
Run Code Online (Sandbox Code Playgroud)

问题是,当我想发布如下数据时:
{ "id": 4, "title": "Python", "description": "Learn python course", "folder": { "id": 1, "name ": "Lesson" } }
我收到了这个错误 folder_data =validated_data.pop('folder') KeyError: 'folder'
我需要一些帮助

Ane*_*R S 5

之所以会出现Key 错误,是因为您已read_only=TrueTodoSerializer. 所以validated_data不会包含folderkey。而且您也不能required=False用于文件夹。因为您的Todo模型定义说文件夹是必填字段。因此,要使其工作,请按如下方式重写您的序列化程序

class FolderSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('id','name',)
        model = models.Folder

class TodoSerializer(serializers.ModelSerializer):
    folder = FolderSerializer()
    class Meta:
        fields = ('id','title','description','folder',)
        model = models.Todo

    def create(self, validated_data):
        folder_data = validated_data.pop('folder')
        folder = models.Folder.objects.create(**folder_data)
        todo = models.Todo.objects.create(folder=folder, **validated_data)
        return todo
Run Code Online (Sandbox Code Playgroud)

注意:由于您正在使用serializers.ModelSerializer,您不必extra_kwargs为序列化程序编写条件。ModelSerializer 本身从模型创建。extra_kwargs仅用于覆盖序列化程序中的模型默认行为。