我正在尝试使用Django Rest Framework为特定模型构建批量更新视图。在短期内,它只需要更新一个字段(将邀请从提交= False切换为提交= True),但我希望它能够在将来提供更多功能。但是,每当我测试视图时,都会创建一个新对象,而不是当前正在修改的对象。
我觉得这对我来说一定是一个简单的错误,但我无法弄清楚发生了什么。序列化程序对象似乎忽略了通过JSON传入的“id”的值,这可能导致该问题。目前的代码是:
class InviteBulkUpdateView(generics.UpdateAPIView):
def get_queryset(self):
order = self.kwargs['order']
invite = get_objects_for_user(self.request.user, 'sourcing.view_invite')
return invite.filter(order=order)
serializer_class = InviteInputSerializer
def put(self, request, *args, **kwargs):
data = request.DATA
serializer = InviteInputSerializer(data=data, many=True)
if serializer.is_valid():
serializer.save()
return Response(status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
class InviteInputSerializer(serializers.ModelSerializer):
class Meta:
model = Invite
fields = ('id', 'order', 'team', 'submitted')
任何人都可以对我可能做错的事情有所了解吗?
答案 0 :(得分:9)
为了防止某人正在寻找一个库来处理这个问题,我写了一个Django-REST-Framework-bulk,允许在几行中执行此操作(该示例仅进行批量更新,但该库也允许批量创建和删除):
from rest_framework_bulk import ListCreateBulkUpdateAPIView
class FooView(ListCreateBulkUpdateAPIView):
model = FooModel
答案 1 :(得分:5)
弹出的显而易见的事情是你没有将对象实例传递给序列化程序。 (因此它将创建新实例而不是更新。)请参阅docs on dealing with multiple objects in serializers,您将在其中看到传递的QuerySet。
答案 2 :(得分:0)
Django有update方法来处理。您可能想从django documentation阅读完整的信息。
这是一个示例代码,您可以在其中用于更新多个记录的给定字段:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.exceptions import APIException
class Room_Update_ViewSet(APIView):
def put(self, request,*args, **kwargs):
hotel_id = self.kwargs.get('hotel_id')
room_ids = self.request.query_params.get('room_ids')
room_ids = list(map(int, room_ids.split(',')))
try:
Room.objects.filter(hotel_id=hotel_id,id__in=room_ids).update(booked_status=False)
instances = Room.objects.filter(hotel_id=hotel_id,id__in=room_ids)
serializer = RoomSerializer(instance=instances, many=True)
return Response(serializer.data,status=status.HTTP_200_OK)
except Exception as e:
print("Error udating rooms-->",e)
raise APIException