Django Rest Framework序列化器未显示字段及POST请求报错求助
问题:DRF APIView页面不显示name表单字段,提交请求返回400 Bad Request
视图代码(HelloApiView)
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from profiles_api import serializers class HelloApiView(APIView): """Test API View""" serializers_class = serializers.HelloSerializer # specifies the Input expected when GET,PUT,POST,DELETE is requested def get(self, request, format=None): """Returns a list of APIView features""" an_apiview = [ "Uses HTTP methods as function (get, post, patch, put, delete)", "Similar to django view, but specific for APIs", "Gives you the most control over your application", "Is mapped manually to urls", ] return Response({"message": "Hello!", "an_apiview": an_apiview}) def post(self, request): """Create a hello message with our name""" serializer = self.serializer_class(data=request.data) # serializers_class comes with the APIView that retrieves the configured Serializer Class for our view (Standard way) if serializer.is_valid(): name = serializer.validated_data.get("name") message = f"Hello {name}" return Response({"message": message}) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
序列化器代码(serializers.py)
from rest_framework import serializers class HelloSerializer(serializers.Serializer): """Serializes a name field for testing APIView""" # similar to django forms name = serializers.CharField(max_length=10)
URL配置(urls.py)
from django.urls import path from profiles_api import views urlpatterns = [ path("hello-view/", views.HelloApiView.as_view()), ]
问题现象
- 启动服务器后,DRF自带页面未显示
name表单字段,仅显示Content字段 - 提交包含
name值(如"Hola")的请求时,返回400 Bad Request错误 - 曾尝试在序列化器中添加Meta类,问题未解决
解决方案
1. 修正视图中的序列化器属性名
APIView中指定序列化器的正确属性名是**serializer_class(单数形式)**,你当前代码中写的是serializers_class(复数),这会导致DRF无法识别自定义序列化器,从而默认显示通用的Content字段。
修改视图中的属性:
# 原错误代码 serializers_class = serializers.HelloSerializer # 修正为 serializer_class = serializers.HelloSerializer
2. 验证提交流程
修正属性后,刷新DRF页面,选择POST方法即可看到name表单字段,填写符合要求的值(长度≤10)提交,即可正常返回结果。
补充说明
- 对于
serializers.Serializer(非模型序列化器),不需要添加Meta类,你的序列化器定义本身是正确的,问题根源完全在于视图中的属性名错误。 - 只有使用
serializers.ModelSerializer关联数据库模型时,才需要通过Meta类指定模型和字段。
内容的提问来源于stack exchange,提问作者albdev
相关产品推荐
相关产品推荐

