Django Rest Framework批量更新插入而不是更新

时间:2013-08-22 17:54:07

标签: django django-rest-framework

我正在尝试使用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')

任何人都可以对我可能做错的事情有所了解吗?

3 个答案:

答案 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