如何通过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' # 设置约束名称,便于后续识别维护 ) ]
生效步骤
- 生成迁移文件:执行
python manage.py makemigrations - 应用迁移到数据库:执行
python manage.py migrate
注意事项
- 该约束是数据库层面的,任何写入操作(包括直接执行SQL、第三方应用操作)都会被PostgreSQL拦截,违反约束时会抛出数据库错误。
- 如果当前表中已有NaN值,需先手动清理这些数据,否则迁移会执行失败。
内容的提问来源于stack exchange,提问作者szamani20
相关产品推荐
相关产品推荐

