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

数据异常时取消ModelViewSet的create操作实现方案咨询

解决方案

问题出在你的代码逻辑顺序或isDataGood的实现上——如果校验失败时没阻止后续创建逻辑执行,就会导致数据被错误插入。以下是具体修复方案:

1. 让isDataGood校验失败时主动抛出异常

修改isDataGood函数,当数据不符合要求时抛出Django的ValidationError(或自定义异常),而非仅做检查不报错:

from django.core.exceptions import ValidationError

def isDataGood(data):
    # 示例校验逻辑:检查文件是否为PDF
    if not data.get('file') or not data['file'].name.endswith('.pdf'):
        raise ValidationError("This file is not pdf")
    # 其他自定义校验规则...

2. 调整create方法的执行顺序

把创建数据的逻辑放在校验通过之后,确保校验失败时完全跳过数据库写入操作:

class DrawingViewSet(viewsets.ModelViewSet):
    queryset = m.Drawing.objects.all()
    serializer_class = s.DrawingSerializer

    def create(self, request, *args, **kwargs):
        # 用上下文管理器临时修改request.data的可写性,避免全局影响
        with request.data.mutable():
            request.data['update_user'] = request.user.id 
            request.data['create_user'] = request.user.id
        
        try:
            # 先执行数据校验,失败则直接进入异常处理块
            isDataGood(request.data)
            # 校验通过后,再调用父类的create逻辑执行数据库写入
            return super().create(request, *args, **kwargs)
        except ValidationError as e:
            logger.error(f"data is not good: {e}")
            return Response(data={'error': str(e)}, status=406)

关键注意点

  • 不要用except:捕获所有异常,这会掩盖数据库连接、序列化错误等其他问题,只捕获isDataGood抛出的特定异常即可。
  • 校验逻辑必须放在任何创建数据的代码之前,确保校验失败时直接返回错误,不会触发数据库写入。
  • 使用request.data.mutable()上下文管理器比直接设置_mutable = True更安全,不会影响后续请求的data状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:52:37