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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:10:58