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

Django中如何返回请求体缺失参数错误并设置可选参数默认值

实现代码
from rest_framework import viewsets
from rest_framework.response import Response
from .models import Order

class OrderViewSet(viewsets.ViewSet):
    def list(self, request):
        orders = Order.objects.all()
        # 注意:实际生产环境需要对orders做序列化处理,此处保留原代码逻辑
        return Response({
          "code": "success",
          "orders": orders,
        })

    def create(self, request):
        # 校验product_id必填参数
        if "product_id" not in request.data:
            return Response(
                {
                    "code": "invalid-request",
                    "details": {
                        "product_id": {
                            "type": "required",
                            "message": "Product id is required",
                        }
                    }
                },
                status=400
            )
        # 非必填字段comment使用get方法设置默认空字符串,避免KeyError
        comment = request.data.get("comment", "")
        product_id = request.data["product_id"]
        order = Order(comment=comment, product_id=product_id)
        order.save()
        return Response({
          "code": "success",
        })
修改点说明
  • product_id必填校验:在获取参数前先判断product_id是否存在于请求体中,不存在则直接返回要求格式的错误响应,搭配400状态码符合REST接口规范
  • comment非必填处理:使用字典的get()方法获取comment参数,第二个参数传入默认值空字符串'',请求未携带该参数时会自动取默认值,不会触发KeyError
可选优化方案(基于DRF序列化器)

如果项目规模较大,推荐使用DRF序列化器统一做参数校验,代码可维护性更高:

  1. 先定义序列化器
from rest_framework import serializers
from .models import Order

class OrderCreateSerializer(serializers.Serializer):
    product_id = serializers.IntegerField(required=True, error_messages={"required": "Product id is required"})
    comment = serializers.CharField(allow_blank=True, required=False, default="")

    def create(self, validated_data):
        return Order.objects.create(**validated_data)
  1. 改造ViewSet的create方法
def create(self, request):
    serializer = OrderCreateSerializer(data=request.data)
    if not serializer.is_valid():
        # 格式化错误返回符合要求的结构
        error_details = {}
        for field, errors in serializer.errors.items():
            error_details[field] = {
                "type": "required" if "required" in errors[0].code else errors[0].code,
                "message": errors[0]
            }
        return Response(
            {
                "code": "invalid-request",
                "details": error_details
            },
            status=400
        )
    serializer.save()
    return Response({"code": "success"})

内容的提问来源于stack exchange,提问作者nanakondor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:00:00