gpt4 book ai didi

python - Django Rest Framework ListSerializer 部分更新

转载 作者:行者123 更新时间:2023-12-01 06:41:45 26 4
gpt4 key购买 nike

我正在编写一个序列化器来为 django 模型提供多个部分更新。我正在遵循 DRF api 指南中出现的示例实现,复制如下并链接到此处:https://www.django-rest-framework.org/api-guide/serializers/#customizing-multiple-update

以下内容是从 django-rest-framework 文档中检索的:

序列化器.py

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))

# Perform deletions.
for book_id, book in book_mapping.items():
if book_id not in data_mapping:
book.delete()

return ret

class BookSerializer(serializers.Serializer):
# We need to identify elements in the list using their primary key,
# so use a writable field here, rather than the default which would be read-only.
id = serializers.IntegerField()
...

class Meta:
list_serializer_class = BookListSerializer

在我的代码中,当调用 .save() 时,我的views.py 中收到 NotImplementedError('update() must be Implemented.')返回的序列化器。

我的理解是 ListsSerializer 会覆盖 .update(),所以有人可以帮助解释为什么我收到 NotImpletmentedError 吗?

views.py

elif request.method == 'PATCH':
data = JSONParser().parse(request)
books = Book.objects.all()
# both partial and many set to True
serializer = BookSerializer(books, data=data, partial=True, many=True)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
return JsonResponse(serializer.errors, status=400)

最佳答案

在@luistm的帮助下,我成功解决了这个问题。继续上面的 DRF 示例,我在 bookSerializer 类中的 update() 重写实现如下。

序列化器.py

class BookSerializer(serializers.Serializer):
# We need to identify elements in the list using their primary key,
# so use a writable field here, rather than the default which would be read-only.
id = serializers.IntegerField()
...

class Meta:
list_serializer_class = BookListSerializer

def update(self, instance, validated_data):
"""update the page number of the book and save"""
instance.page = validated_data.get('page', instance.page)
instance.save()
return instance

关于python - Django Rest Framework ListSerializer 部分更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59424738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com