【问题标题】:Unable to get the response for POST request to APIView of Django Rest-framework无法获得对 Django Rest-framework 的 APIView 的 POST 请求的响应
【发布时间】:2020-01-04 06:59:17
【问题描述】:

我将发布请求发送到 OrganisationApiView 类。请求正文包含以下 JSON。

{
"organisation_id" : "1",
"organisation_name" "Some Name"
}

views.py

from typing import Optional, Any
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.parsers import JSONParser

from . import serializers


class OrganisationApiView(APIView):

    serializers_class = serializers.OrganisationSerializer
    parser_classes = [JSONParser]

    def get(self, request, formate=None):
        return Response({"message": "You are Cool!!"})

    def post(self, request, formate=None):
        serializer = self.serializers_class(data=request.data)
        print(serializer)

        if serializer.is_valid():
            organisation_name = serializer.validated_data.get('organisation_name')
            message = f"Reached POST {organisation_name}"
            return Response({'message': message, status: 'HTTP_200_OK'})
        else:
            return Response(
                serializer.errors,
                status=status.HTTP_400_BAD_REQUEST
            )

    def put(self, request, pk=None):
        return Response({"message": "PUT"})

    def patch(self, request, pk=None):
        return Response({"message": "PATCH"})

    def delete(self, request, pk=None):
        return Response({"message": "Delete"})

我收到邮递员的回复为 -

TypeError at /api/organisation/
keys must be str, int, float, bool or None, not module
Request Method: POST
Request URL:    http://127.0.0.1:8000/api/organisation/
Django Version: 2.1.15
Exception Type: TypeError
Exception Value:    
keys must be str, int, float, bool or None, not module
Exception Location: /usr/local/lib/python3.7/json/encoder.py in iterencode, line 257
Python Executable:  /usr/local/bin/python
Python Version: 3.7.6
Python Path:    
['/app',
 '/usr/local/lib/python37.zip',
 '/usr/local/lib/python3.7',
 '/usr/local/lib/python3.7/lib-dynload',
 '/usr/local/lib/python3.7/site-packages']
Server time:    Sat, 4 Jan 2020 06:42:54 +0000

GET、PUT、PATCH、DELETE 等其他请求运行良好。我不明白究竟是什么导致了这个问题。我还定义了 SimpleSerializers,如下所述。

from rest_framework import serializers
class OrganisationSerializer(serializers.Serializer):
    organisation_id = serializers.IntegerField()
    organisation_name = serializers.CharField(max_length=255, allow_null=False, allow_blank=False)

另外,我不想在模型中接受 organisation_id,因为我已将其定义为主键。 但是当我发送没有 organisation_id 的 JSON 时,它会引发一个错误,指出字段 organisation_id 是必需的。到目前为止,我只想接受 organisation_name 并将其作为响应返回。

【问题讨论】:

    标签: python-3.x django-rest-framework


    【解决方案1】:

    您试图将serializer.errors 作为 JSON 数据返回,但它不是字典,而是模块。您可以改用serializer.error_messages

    试试这个:

    else:
        return Response(
            serializer.error_messages,
            status=status.HTTP_400_BAD_REQUEST
        )
    

    更好的解决方案

    由于您只是试图返回序列化过程的详细信息,因此在调用序列化器的is_valid函数时,如果序列化器无效,您可以传递一个参数来触发异常。 serializer.is_valid(raise_exception=True)。它的默认格式将满足您的需求。代码将是:

    def post(self, request, formate=None):
        serializer = self.serializers_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        organisation_name = serializer.validated_data.get('organisation_name')
        message = f"Reached POST {organisation_name}"
        return Response({'message': message, status: 'HTTP_200_OK'})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-06
      • 2020-12-07
      • 2016-11-13
      • 1970-01-01
      • 2019-11-20
      • 2021-12-24
      • 2023-01-08
      • 1970-01-01
      相关资源
      最近更新 更多