Django models.Model用clean方法校验不返回正确JSON错误如何解决?
问题修复方案
1. 修复模型校验逻辑错误
你当前的校验逻辑存在两处问题:
category是关联Category表的外键,不能直接和字符串"cars"做相等判断,需要对比关联的分类实例的name属性CharField类型如果用户传入空字符串,值为""而非None,空值判断需要覆盖这两种场景
修改后的clean方法代码如下:
from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ class Product(models.Model): def save(self, **kwargs): self.clean() return super().save(**kwargs) def clean(self): if self.category.name == "cars": # 只要x字段有非空值就抛出错误 if self.x not in (None, ""): # 以字典格式指定字段对应的错误信息,后续返回JSON时结构更清晰 raise ValidationError({ "x": _("当分类为cars时,x字段不允许填写任何值") }) category = models.ForeignKey( Category, on_delete=models.PROTECT, default='cars') x = models.CharField( max_length=10, choices=X_OPTIONS, blank=True, null=True)
2. 适配接口返回JSON格式错误
Django模型层抛出的ValidationError默认不会被自动转换为API友好的JSON响应,会直接抛出500错误仅在控制台打印日志,需要根据你使用的框架做对应处理:
情况1:使用Django REST Framework(DRF)
DRF默认会自动捕获模型层的ValidationError并转换为JSON响应,前提是你通过DRF序列化器完成参数校验和实例保存。如果是自定义逻辑直接调用模型save方法,需要手动捕获异常:
from rest_framework.response import Response from rest_framework import status from django.core.exceptions import ValidationError # 视图保存逻辑示例 def post(self, request): product = Product(**request.data) try: product.save() except ValidationError as e: return Response(e.message_dict, status=status.HTTP_400_BAD_REQUEST) return Response({"id": product.id}, status=status.HTTP_201_CREATED)
情况2:使用原生Django视图
手动捕获异常后构造JSON响应即可:
from django.http import JsonResponse from django.core.exceptions import ValidationError def create_product(request): # 构造Product实例逻辑省略 try: product.save() except ValidationError as e: return JsonResponse({"errors": e.message_dict}, status=400) return JsonResponse({"code": 0, "msg": "创建成功"})
内容的提问来源于stack exchange,提问作者some nooby questions
相关产品推荐
相关产品推荐

