Skip to content

BookListSerializer example for create case is still flawedΒ #9469

@mangelozzi

Description

@mangelozzi

This example at https://www.django-rest-framework.org/api-guide/serializers/#customizing-multiple-update

class BookListSerializer(serializers.ListSerializer):
    def update(self, instance, validated_data):
        # Maps for id->instance and id->data item.
        book_mapping = {book.id: book for book in instance}
        data_mapping = {item['id']: item for item in validated_data}

        # Perform creations and updates.
        ret = []
        for book_id, data in data_mapping.items():
            book = book_mapping.get(book_id, None)
            if book is None:
                ret.append(self.child.create(data))
            else:
                ret.append(self.child.update(book, data))

The update method handles update/insertions/deletes. In the insertion case, because an id key value pair will not exist in validated data, so this line:

 data_mapping = {item['id']: item for item in validated_data}

Will fail at item['id'], maybe it should be item.get('id'), but then maybe the rest of it might have to change too, e.g.:

         for book_id, data in data_mapping.items():
            if not book_id:
                ret.append(self.child.create(data))
            else:
                object = object_mapping.get(book_id, None)
                ret.append(self.child.update(object, data))

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions