You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:52:34