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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:39:03