【问题标题】:Django get_serializer 'NoneType' object is not callableDjango get_serializer 'NoneType' 对象不可调用
【发布时间】:2021-03-13 17:04:01
【问题描述】:

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

我正在打电话给http://127.0.0.1:8000/api/users/1/documents/(1 - 用户 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",
        )

【问题讨论】:

  • 您编写 if self.request.version == "1.0": 并为此返回一个序列化程序,但如果该条件为假会发生什么?

标签: python django django-rest-framework


【解决方案1】:

您必须始终从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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2019-08-12
    • 2012-08-10
    • 2015-04-29
    相关资源
    最近更新 更多