Среда отдыха Django - представление API жалуется на ответ NoneType - PullRequest
0 голосов
/ 18 октября 2018

Я использую ModelViewSet для создания объектов из параметров, полученных в запросе POST.Сериализатор выглядит следующим образом:

class FooSerializer(ModelSerializer):
    class Meta:
        model = Foo
        fields = '__all__'

Я хочу перехватить запрос и выполнить его проверку (по методу модели, если это имеет значение), прежде чем разрешить продолжить создание.В ванильных формах django я переопределяю метод form_valid, выполняю проверку и затем вызываю super (). Form_valid (...).Я пытаюсь сделать то же самое здесь:

class BookingView(ModelViewSet):
    queryset = DirectBooking.objects.all()
    serializer_class = DirectBookingSerializer

    def create(self, request):
        print(request.data)
        #Perform check here
        super().create(request)

Это работает, в том смысле, что он создает объект в БД, но трассировка показывает ошибку:

AssertionError: Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` to be returned from the view, but received a `<class 'NoneType'>`

Этокажется странным, так как я ожидаю, что super (). save вернет соответствующий ответ.

Я знаю, что мне придется возвращать ответ сам, если проверка не удалась (вероятно, 400), но я бывсе еще хотел бы понять, почему это терпит неудачу здесь.

1 Ответ

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

Представление должно возвращать HttpResponse.В ViewSet вы не реализуете .get(..) и .post(..) напрямую, но они выполняют некоторую обработку и перенаправляют на другие функции, такие как .create(..) и .list(..).

Таким образом, эти представления должнызатем верните HttpResponse (или «друзья»), здесь вы звоните super().create(request), но вы забыли вернуть ответ на этот вызов в результате вашей create(..) версии.

Таким образом, вы должныдобавить оператор return, например:

class BookingView(ModelViewSet):
    queryset = DirectBooking.objects.all()
    serializer_class = DirectBookingSerializer

    def create(self, request):
        print(request.data)
        #Perform check here
        <b>return</b> super().create(request)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...