在django rest泛型CreateAPIView中覆盖create方法

Nag*_*nan 7 python django django-generic-views django-rest-framework

我的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 
Run Code Online (Sandbox Code Playgroud)

在上面的内容中如果我覆盖了create函数,则返回失败并出现以下错误,即使我没有做任何事情,只是写入传递它失败了,

AssertionError: Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` to be returned from the view, but received a `<class 'NoneType'>`
Run Code Online (Sandbox Code Playgroud)

Raj*_*jez 10

返回应该是instanceof Response.你可以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)
Run Code Online (Sandbox Code Playgroud)

或者如果你不想要父响应,那么只需返回一个Response实例

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


wen*_*isa 6

您的视图应该返回一个Response对象,如堆栈跟踪中所述AssertionError

对于您的情况,您可以尝试返回一个空值Response以测试您的视图和您的serializer.data

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)
Run Code Online (Sandbox Code Playgroud)

通常,您希望serializer.validated_data最终返回您的内容,因此这一行可能如下所示:

return Response(serializer.validated_data, status=status.HTTP_201_CREATED)
Run Code Online (Sandbox Code Playgroud)