繁体   English   中英

Django get_serializer 'NoneType' object 不可调用

[英]Django get_serializer 'NoneType' object is not callable

我正在测试 Django (DRF) 应用程序的 API。

我打电话给http://127.0.0.1:8000/api/users/1/documents/ (1 - user id) 并收到错误

...

File "/app/backend/apps/users/views/users/views.py" in create
  542.         serializer = self.get_serializer(data=request.data)

File "/usr/local/lib/python3.7/site-packages/rest_framework/generics.py" in get_serializer
  110.         return serializer_class(*args, **kwargs)

Exception Type: TypeError at /api/users/1/documents/
Exception Value: 'NoneType' object is not callable

我如何识别问题?

请求相关视图 /app/backend/apps/users/views/users/views.py (问题行是serializer = self.get_serializer(data=request.data)

class UserDocumentCreate(generics.CreateAPIView, generics.RetrieveAPIView):
    serializer_class = UserDocumentSerializer
    permission_classes = (UserIsOwner, IsAuthenticatedDriver)
    queryset = Document.objects.all()

    def get_serializer_class(self):
        if self.request.version == "1.0":
            return UserDocumentSerializer
        # return UserDocumentSerializer2

    def create(self, request, *args, **kwargs):
        request.data._mutable = True
        request.data["owner"] = kwargs.get("pk")
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            owner = serializer.validated_data.get("owner")
            document_type = serializer.validated_data.get("document_type")
            message_status = request.data.get("message_status")
            documents = owner.document_owner.filter(
                document_type=document_type
            )
            for document in documents:
                if document.status == DocumentStatus.DOCUMENT_REJECTED_STATUS:
                    document.delete()

            # Mark user as new
            owner.is_new_user = True
            owner.save()

            self.perform_create(serializer)
            headers = self.get_success_headers(serializer.data)

            response = {
                "status": status.HTTP_201_CREATED,
                "result": serializer.data,
            }
            # accept corresponding registration message
            if message_status:
                driver_reg = DriverRegistration.objects.filter(user=kwargs.get("pk")).first()
                driver_reg.accept_by_status(message_status)
                next_id = driver_reg.get_next()
                # add information about next registration message to response
                if next_id != -1:
                    response["next_message"] = REG_MESSAGES[next_id].to_json()

            return Response(
                response, status=status.HTTP_201_CREATED, headers=headers
            )

相关序列化程序(没什么特别的)

class UserDocumentSerializer(serializers.ModelSerializer):
    is_new_document = serializers.BooleanField(read_only=True)

    class Meta:
        model = Document
        fields = (
            "id",
            "owner",
            "file",
            "document_type",
            "uploaded_at",
            "is_new_document",
        )

您必须始终从get_serializer_class方法返回一个值。

您需要实现一个 else 条件,或者显式地(就像你评论过的那个),或者使用serializer_class ,或者回退到 super 方法。

class UserDocumentCreate(generics.CreateAPIView, generics.RetrieveAPIView):
    serializer_class = UserDocumentSerializer
    permission_classes = (UserIsOwner, IsAuthenticatedDriver)
    queryset = Document.objects.all()

    def get_serializer_class(self):
        if self.request.version == "1.0":
            return UserDocumentSerializer
        else:
            # explicit
            return UserDocumentSerializer2
            # property
            return self.serializer_class
            # super
            return super(UserDocumentCreate, self).get_serializer_class()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM