Развертывание массовых обновлений Django Rest Framework вместо обновления

Я пытаюсь создать массовое представление обновления для конкретной модели с помощью Django Rest Framework. В краткосрочной перспективе необходимо обновить только одно поле (переключая приглашение от отправленного = False на отправленный = True), но я бы хотел, чтобы он мог обеспечить больше функциональности в будущем. Однако, когда я проверяю представление, создается новый объект вместо текущего, который изменяется.

Я чувствую, что это должна быть простая ошибка с моей стороны, но я не могу понять, что происходит. Объект serializer, по-видимому, игнорирует значение "id", переданное через JSON, что может способствовать этому вопросу. Текущий код:

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')

Кто-нибудь может пролить свет на то, что я могу сделать неправильно?

2 ответа

Очевидная вещь, которая появляется, заключается в том, что вы не передаете экземпляры объектов вашему сериализатору. (Таким образом, он будет создавать новые экземпляры, а не обновлять.) См. документы для работы с несколькими объектами в сериализаторах, где вы увидите, что ваш QuerySet передан в.


На всякий случай кто-то ищет библиотеку для обработки этого, я написал Django-REST-Framework-bulk, который позволяет сделать это в нескольких строках (только пример делает массовое обновление, но библиотека также позволяет массовое создание и удаление):

from rest_framework_bulk import ListCreateBulkUpdateAPIView
class FooView(ListCreateBulkUpdateAPIView):
 model = FooModel

licensed under cc by-sa 3.0 with attribution.