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

Django使用原生SQL前,如何通过Model校验数据类型完整性?

Django Model 校验原生SQL插入参数的方法

你完全可以利用Django内置的Model校验机制来实现这个需求,不用自己手动编写check_types()方法——Django已经提供了full_clean()方法,能帮你完成字段类型、约束规则的全面校验。

核心思路

当你实例化Model对象时,Django会做基础的类型转换,但完整的校验(比如字段长度、数值范围、精度要求等)需要通过full_clean()方法触发。这个方法会自动校验所有字段的规则,不符合要求时会抛出ValidationError异常,你可以捕获并处理这些异常,确认参数合法后再执行原生SQL。

具体实现代码

from django.core.exceptions import ValidationError
from django.db import connection

# 待插入的参数示例
name = "测试产品"
product_count = 10
paid_amount = 99.99

try:
    # 1. 实例化Model对象,传入待校验的参数(不需要调用save())
    m = MyModel(name=name, product_count=product_count, paid_amount=paid_amount)
    
    # 2. 触发完整校验:包括类型、长度、数值范围、精度等所有规则
    m.full_clean()
    
    # 3. 校验通过,执行原生SQL插入
    with connection.cursor() as cursor:
        cursor.execute(
            "insert into mymodel (name, product_count, paid_amount) values (%s, %s, %s);",
            [m.name, m.product_count, m.paid_amount]
        )
    print("数据插入成功")

except ValidationError as e:
    # 处理校验失败的情况,e.message_dict会返回每个字段的错误信息
    print("参数校验失败:", e.message_dict)

为什么full_clean()能满足需求?

它会自动执行以下校验逻辑:

  • 字段类型校验:确保name是字符串、product_count是正整数、paid_amount是十进制数,不符合类型的参数会触发转换或报错
  • 约束规则校验:检查name的长度不超过768字符、product_count是正整数(不能为负)、paid_amount的小数位数不超过2位
  • 空值处理:针对product_count和paid_amount的null=True/blank=True规则,自动处理合法的空值(比如传入None是允许的,但传入负数给product_count会报错)

额外注意点

  • 如果你的Model自定义了clean()方法(用于自定义业务规则校验),full_clean()也会自动调用它
  • 实例化Model时,部分基础类型转换会自动完成(比如传入字符串形式的数字给product_count,Django会尝试转成整数),但如果转换失败,full_clean()会抛出异常
  • 执行原生SQL时,直接使用校验后的Model属性值(比如m.name),可以避免手动处理参数转换的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:38:10