如何在Django模型中为JSON字段添加MySQL CHECK约束?
在Django模型中实现JSON字段的经纬度格式校验约束
以下是对应的Test模型代码,通过CheckConstraint结合MySQL的JSON_SCHEMA_VALID函数实现需求:
from django.db import models from django.db.models import CheckConstraint, Func, F class Test(models.Model): sss = models.JSONField() class Meta: constraints = [ CheckConstraint( # 调用MySQL的JSON_SCHEMA_VALID函数校验sss字段格式 check=Func( # 定义JSON Schema规则:要求包含合法的latitude和longitude '''{ "type": "object", "required": ["latitude", "longitude"], "properties": { "latitude": { "type": "number", "minimum": -90, "maximum": 90 }, "longitude": { "type": "number", "minimum": -180, "maximum": 180 } } }''', F('sss'), function='JSON_SCHEMA_VALID' ), # 约束名称,需在数据库中唯一 name='sss_valid_lat_lng' ) ]
关键说明:
Func类用于封装MySQL原生的JSON_SCHEMA_VALID函数,直接生成对应的SQL校验逻辑,和你原本的ALTER TABLE约束逻辑完全一致。- JSON Schema规则明确了:
sss必须是JSON对象类型- 必须包含
latitude和longitude两个字段 - 纬度范围限制在-90到90之间,经度范围限制在-180到180之间
F('sss')引用模型中的sss字段,作为校验的目标对象。
注意:
- 该实现依赖MySQL 8.0.19及以上版本,因为这个版本才引入了
JSON_SCHEMA_VALID函数。 - 运行迁移后,Django会自动在数据库中生成对应的CHECK约束,效果等同于你手动执行ALTER TABLE语句。
内容的提问来源于stack exchange,提问作者Relax ZeroC
相关产品推荐
相关产品推荐

