9

我正在尝试使用 Django Rest Framework 为特定模型构建批量更新视图。在短期内,它只需要更新一个字段(将邀请从提交=假切换到提交=真),但我希望它能够在未来提供更多功能。然而,每当我测试视图时,都会创建一个新对象,而不是修改当前对象。

我觉得这一定是我的一个简单错误,但我无法弄清楚发生了什么。序列化程序对象似乎忽略了通过 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')

任何人都可以阐明我可能做错了什么吗?

4

3 回答 3

11

万一有人正在寻找一个库来处理这个问题,我写了一个Django-REST-Framework-bulk允许在几行中做到这一点(该示例仅进行批量更新,但该库还允许批量创建和删除) :

from rest_framework_bulk import ListCreateBulkUpdateAPIView

class FooView(ListCreateBulkUpdateAPIView):
    model = FooModel
于 2014-01-30T16:25:25.313 回答
6

您没有将对象实例传递给您的序列化程序。(因此它将创建新实例而不是更新。)请参阅有关在序列化程序中处理多个对象的文档,您将在其中看到传入的 QuerySet。

于 2013-08-23T08:07:53.880 回答
0

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
于 2020-03-14T07:22:28.633 回答