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'
我需要一些帮助
之所以会出现Key 错误,是因为您已read_only=True为TodoSerializer. 所以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仅用于覆盖序列化程序中的模型默认行为。
| 归档时间: |
|
| 查看次数: |
2603 次 |
| 最近记录: |