Django Rest Framework DELETE не возвращает содержимого в теле - PullRequest
0 голосов
/ 06 октября 2018

Я использую Django Rest Framework и делаю запрос DELETE.В отличие от POST, PUT, PATCH, которые все возвращают состояние объекта после создания / изменения, delete не возвращает ничего в теле (только код 204).

Наличие этой информации было бы полезно при попытке привязать ответы к их исходным запросам.В частности https://github.com/agraboso/redux-api-middleware плохо говорит мне, что удалось и что допустило ошибку)

Есть ли способ заставить DRF добавить информацию о том, что было удалено в теле ответа?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Дополнение полного ответа @ Linovia с помощью действующего кода.

В ViewSet добавление следующего поможет

class WhateverYourModelIsViewSet(viewsets.ModelViewSet):
    def destroy(self, *args, **kwargs):
        serializer = self.get_serializer(self.get_object())
        super().destroy(*args, **kwargs)
        return response.Response(serializer.data, status=status.HTTP_200_OK)

Мало что следует знать:

  • Возвращая код 204, вы фактически отбросите данные, вы должны вернуть что-то еще
  • Вам нужно извлечь данные из сериализатора до того, как вы вызовете команду destroy

Редактировать:

С тех пор как я впервые опубликовал свой ответ, я обнаружил, что мне нужно делать это довольно часто.Более масштабируемое решение:

class DestroyWithPayloadMixin(object):
     def destroy(self, *args, **kwargs):
         serializer = self.get_serializer(self.get_object())
         super().destroy(*args, **kwargs)
         return response.Response(serializer.data, status=status.HTTP_200_OK)

class WhateverYourModelIsViewSet(DestroyWithPayloadMixin, viewsets.ModelViewSet):
   # Your implementation 
   pass
0 голосов
/ 06 октября 2018

Конечно.По вашему мнению, вам придется переопределить destroy.Реализация по умолчанию - на момент написания этого ответа -:

def destroy(self, request, *args, **kwargs):
    instance = self.get_object()
    self.perform_destroy(instance)
    return Response(status=status.HTTP_204_NO_CONTENT)
...