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

如何通过Django ORM为PostgreSQL数值列添加禁止NaN的约束

为Django中PostgreSQL的DecimalField添加数据库层面的非NaN约束

因为PostgreSQL的numeric类型允许存储NaN值,即便Django的DecimalField设置了null=False,也无法阻止其他数据源向该列插入NaN。要在数据库层面强制禁止NaN,可通过以下方式实现:

使用Django的CheckConstraint(Django 2.2+)

直接在模型的Meta类中添加CheckConstraint,利用PostgreSQL的IS NOT NaN检查规则:

from django.db import models
from django.db.models import CheckConstraint, Q

class YourModel(models.Model):
    amount = models.DecimalField(max_digits=32, decimal_places=8, blank=False, null=False)

    class Meta:
        constraints = [
            CheckConstraint(
                check=Q(amount__isnan=False),
                name='amount_not_nan'  # 设置约束名称,便于后续识别维护
            )
        ]

生效步骤

  1. 生成迁移文件:执行python manage.py makemigrations
  2. 应用迁移到数据库:执行python manage.py migrate

注意事项

  • 该约束是数据库层面的,任何写入操作(包括直接执行SQL、第三方应用操作)都会被PostgreSQL拦截,违反约束时会抛出数据库错误。
  • 如果当前表中已有NaN值,需先手动清理这些数据,否则迁移会执行失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:14:52