web-dev-qa-db-ja.com

Django RESTジェネリックCreateAPIViewのcreateメソッドをオーバーライドします。

Djangoアプリの私のviews.pyは以下の通りです、

class MemberCreate(generics.CreateAPIView):
    queryset = members.objects.all()
    serializer_class = MemberSerializer
    permission_classes = (permissions.IsAdminUser,)

    def create(self, serializer):
        ''' I wanted to do some stuff with serializer.data here '''
        pass 

上記のcreate関数をオーバーライドすると、次のエラーで戻りが失敗します。何もせず、書き込みパスだけを実行しても失敗します。

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

戻り値はinstanceofResponseです。parentの後にstuffクラス応答を返すことができます

def create(self, request, *args, **kwargs):
    ''' I wanted to do some stuff with serializer.data here '''
    return super(MemberCreate, self).create(request, *args, **kwargs)

または、親の応答が必要ない場合は、Responseインスタンスを返すだけです

def create(self, request, *args, **kwargs):
    ''' I wanted to do some stuff with serializer.data here '''
    return Response(status=204)
9
Rajez

Responseスタックトレースで述べたように、ビューはAssertionErrorオブジェクトを返す必要があります。

あなたの場合、あなたのビューとserializer.dataをテストするために空のResponseを返すことを試みることができます

from rest_framework.response import Response
from rest_framework import status


class MemberCreate(generics.CreateAPIView):
    queryset = members.objects.all()
    serializer_class = MemberSerializer
    permission_classes = (permissions.IsAdminUser,)

    def create(self, request, *args, **kwargs):
        serializer = self.serializer_class(...)
        data = serializer.data

        # ...

        return Response(status=status.HTTP_204_NO_CONTENT)

通常、最後にserializer.validated_dataを返したいので、この行はおそらく次のようになります。

return Response(serializer.validated_data, status=status.HTTP_201_CREATED)
2
wencakisa