Развертывание массовых обновлений 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.