KeyError + POST + Django Rest Framework - PullRequest
0 голосов
/ 22 мая 2018

Я новичок в Django Rest Framework и когда я хочу отправить данные POST, и я получаю эту ошибку KeyError в / api / 'folder' .
Вот мой код:
в моем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

в моем 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

И в моем views.py

class  ListTodo(generics.ListCreateAPIView):
    queryset = models.Todo.objects.all()
    serializer_class = serializers.TodoSerializer

Проблема в том, что когда я хочу опубликоватьданные, такие как:
{"id": 4, "title": "Python", "description": "Изучите урок python", "folder": {"id": 1, "name": "Lesson"}}
Я получил эту ошибку folder_data = validated_data.pop ('folder') KeyError: 'folder'
Мне нужна помощь, пожалуйста

1 Ответ

0 голосов
/ 23 мая 2018

Ошибка Key возникает потому, что вы установили read_only=True для папки в TodoSerializer.Так что validated_data не будет содержать folder ключ.А также вы не можете использовать 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

ПРИМЕЧАНИЕ : поскольку вы используете serializers.ModelSerializer, вам не нужно писать условия extra_kwargs для сериализатора,Сам ModelSerializer создает из модели. extra_kwargs используется только для переопределения поведения модели по умолчанию в сериализаторе.

...