Django REST Framework必填字段自定义报错信息不生效如何解决
问题排查与解决方案
核心失效原因
- 你当前的判断逻辑只覆盖了
school.name为None的场景,用户留空字段时Django接收到的通常是空字符串""而非None,现有判断条件无法命中 - 你编写的自定义验证方法没有被Django自动执行的机制,需要确认你在数据保存前主动调用了该方法
修复方案
1. 调整验证判断逻辑
修改validate_name的判断条件,覆盖空字符串、全空格等多种无有效值的场景:
def validate_name(school: School): # 同时匹配None、空字符串、全空格的情况 if not school.name or not school.name.strip(): raise APIException(detail='Name is mandatory.') class SchoolService(object): @staticmethod def validate_create(school: School): validate_name(school)
2. 确保验证逻辑被主动调用
在视图层创建School实例后、保存到数据库前,必须手动调用验证方法:
# 视图层调用示例 from rest_framework.decorators import api_view from rest_framework.response import Response @api_view(['POST']) def create_school(request): school = School(**request.data) # 手动触发验证,不调用则验证逻辑不会执行 SchoolService.validate_create(school) school.save() return Response({"status": "success"})
更规范的DRF实现方案
如果你使用的是Django REST Framework,直接把验证规则放到序列化器中即可自动触发,不需要额外编写自定义验证类:
from rest_framework import serializers class SchoolSerializer(serializers.ModelSerializer): name = serializers.CharField( required=True, error_messages={ "required": "Name is mandatory.", "blank": "Name is mandatory." } ) class Meta: model = School fields = ["name"] # 补充你需要的其他字段即可
视图层直接调用序列化器的is_valid()方法即可自动返回指定的错误提示:
@api_view(['POST']) def create_school(request): ser = SchoolSerializer(data=request.data) ser.is_valid(raise_exception=True) ser.save() return Response({"status": "success"})
内容的提问来源于stack exchange,提问作者user13066942
相关产品推荐
相关产品推荐

