BookListSerializer example for create case is still flawed
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))
do you have the proposed fix in mind to share?
do you have the proposed fix in mind to share?
Yes it's at the end of the above post, is it unclear?
i would like to work on this one.
@mangelozzi, we can't use item.get('id') directly, as the key of dict can't be null.
instead we can loop through the validated_data itself and try to get('id') if it is none create new child then and there only, else get from object_mapping and update.
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.