【发布时间】:2018-07-26 06:40:07
【问题描述】:
我正在尝试使用 https://github.com/miki725/django-rest-framework-bulk 在单个请求中进行批量插入和批量更新,下面是我的列表序列化程序和模型视图集。
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):
class Meta:
list_serializer_class = BookListSerializer
class BookCSVViewSet(generics.BulkModelViewSet):
queryset = Book.objects.all()
serializer_class = BookCSVSerializer
def get_serializer(self, *args, **kwargs):
if "data" in kwargs:
data = kwargs["data"]
if isinstance(data, list):
kwargs["many"] = True
return super(BookCSVViewSet, self).get_serializer(*args, **kwargs)
@list_route(methods=['PUT'])
def bulk_update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
# restrict the update to the filtered queryset
serializer = self.get_serializer(
self.filter_queryset(self.get_queryset()),
data=request.data,
many=True,
partial=partial,
)
validated_data = []
validation_errors = []
for item in request.data:
print self.get_queryset().get(pk=item['id'])
item_serializer = self.get_serializer(
self.get_queryset().get(pk=item['id']),
data=item,
partial=partial,
)
item_serializer.is_valid(raise_exception=True)
if item_serializer.errors:
validation_errors.append(item_serializer.errors)
validated_data.append(item_serializer.validated_data)
if validation_errors:
raise ValidationError(validation_errors)
serializer._validated_data = validated_data
self.perform_bulk_update(serializer)
return Response(serializer.data, status=status.HTTP_200_OK)
我在同一个 HTTP 请求中同时发送现有记录和新记录,
[{id:23, name:"bob", book:"hello"},{id:"299, name:"bob", book:"hello"}]
id:23 是现有记录,id:299 是新记录,旧记录看起来很好,但是当有新记录时,上面的代码在下面的代码行失败,说匹配查询不存在
self.get_queryset().get(pk=item['id'])
请指导如何在单个请求或任何其他方法中进行批量更新和创建。
【问题讨论】:
-
您是否尝试删除
id以获取新记录? -
@no,我怎样才能删除它?在 request.data 中。
标签: python ajax django django-rest-framework