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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:54:03