Django Rest Framework批量更新时插入而非更新

12

我正在尝试使用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个回答

11

如果有人正在寻找一个处理这个问题的库,我写了一个Django-REST-Framework-bulk,它可以在几行代码中完成(这个示例只是批量更新数据,但该库还允许批量创建和删除):

from rest_framework_bulk import ListCreateBulkUpdateAPIView

class FooView(ListCreateBulkUpdateAPIView):
    model = FooModel

34
Django-REST-Framework-bulk 似乎不再得到维护。 - Joseph

7

-1

Django有更新方法来处理这个。您可能需要从Django文档中阅读完整信息。

这是一个示例代码,您可以使用它来更新多个记录的给定字段:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接