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
相关产品推荐
相关产品推荐

