gpt4 book ai didi

django - Django Rest Framework的批量,部分更新

转载 作者:行者123 更新时间:2023-12-03 16:16:56 26 4
gpt4 key购买 nike

我想一次部分更新多个项目。我已经添加了一个mixin来允许我批量创建(并且效果很好),但是即使我添加了部分参数,它也不允许修补列表。

我猜这是一个路由问题。我需要一个新 View 来处理/(而不是/id/)上的PATCH,但我的想法还很深。

现有的答案在3.8中不起作用,或者至少对我不起作用。我需要对以下内容做什么?

class ResourceSerializer(serializers.ModelSerializer):
class Meta:
model = Resource
fields = ('id', 'name', ...)
read_only_fields = ('id',)

class BulkMixin:
def get_serializer(self, *args, **kwargs):
if isinstance(kwargs.get('data', {}), list):
kwargs['many'] = True
kwargs['partial'] = True

return super().get_serializer(*args, **kwargs)

class ResourceViewSet(BulkMixin, viewsets.ModelViewSet):
serializer_class = ResourceSerializer

最佳答案

大约10个小时将我的头撞在墙上之后,我决定采用正确的方法可以坐到后排,我会用可行的破解方法来解决。我在我的视野中添加了以下最讨厌的东西。

from rest_framework.decorators import action

@action(methods=['patch'], detail=False)
def bulk_update(self, request):

data = { # we need to separate out the id from the data
i['id']: {k: v for k, v in i.items() if k != 'id'}
for i in request.data
}

for inst in self.get_queryset().filter(id__in=data.keys()):
serializer = self.get_serializer(inst, data=data[inst.id], partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()

return Response({})
如果我在 [{id: 123, otherfield: "abc"}, ...]列表中打补丁,则现在将进行批量部分更新。我相当确定这是在执行n + 1个查询,并且在原始ORM中效率要高得多……但是,现在,它比n 请求更好。另外,如果ID不在查询集中,它将通过而不是出错。这对我有用,但对其他人可能无效。
我会在48小时内悬赏该问题,以吸引一些好的答案。

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

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