Django3.1对接PostgreSQL12如何通过ORM添加表达式唯一索引
Django ORM 实现PostgreSQL空值唯一约束索引方案
你要的功能可以直接通过Django 3.1新增的表达式索引特性实现,不需要手动编写原生SQL迁移,步骤如下:
1. 导入依赖并修改模型代码
你需要先导入Case、When、Value三个ORM表达式工具,然后在模型的Meta类中配置唯一索引:
from django.db import models from django.db.models import Case, Value, When class Students(models.Model): id = models.BigAutoField(primary_key=True) scoreA = models.CharField(null=True, max_length=15) scoreB = models.CharField(null=True, max_length=15) class Meta: indexes = [ models.Index( # 两个case表达式对应你要的空值转空字符串逻辑 expressions=[ Case( When(scoreA__isnull=False, then='scoreA'), default=Value(''), ), Case( When(scoreB__isnull=False, then='scoreB'), default=Value(''), ) ], name='unq_idx', # 索引名和你给出的原生SQL一致 unique=True # 声明为唯一索引 ) ]
2. 执行迁移
修改完模型后执行两个Django命令即可完成索引创建:
- 生成迁移文件:
python manage.py makemigrations - 执行迁移到数据库:
python manage.py migrate
注意事项
- 如果你的表中已经存在重复数据(包括
scoreA、scoreB同时为NULL的多条记录),需要先清理冲突数据再执行迁移,否则会因为约束校验失败导致迁移报错。 - 生成迁移文件后你可以打开生成的迁移文件,校验内部的索引创建逻辑是否符合预期,确认无误后再执行迁移。
内容的提问来源于stack exchange,提问作者shawdowfax1497
相关产品推荐
相关产品推荐

