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序列化器统一做参数校验,代码可维护性更高:
- 先定义序列化器
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)
- 改造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
相关产品推荐
相关产品推荐

