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

如何在Django中为字段与created_at日期值创建每日唯一约束?

实现Django模型中PostgreSQL字段每日唯一约束

以下两种方法可实现custom_id每日仅能出现一次的需求:

方法一:使用Django原生唯一约束(推荐)

通过UniqueConstraint结合日期转换,直接约束custom_id与created_at的日期部分组合唯一,无需额外数据库扩展,符合Django ORM规范。

模型代码

from django.db import models
from django.db.models import UniqueConstraint, Cast, DateField

class YourModel(models.Model):
    custom_id = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        constraints = [
            UniqueConstraint(
                expressions=[
                    "custom_id",
                    Cast("created_at", output_field=DateField()),
                ],
                name="custom_id_per_day_unique",
            )
        ]

生效步骤

执行迁移命令创建约束:

python manage.py makemigrations
python manage.py migrate

方法二:使用PostgreSQL排他约束(匹配你提到的SQL语句)

该方法需先启用PostgreSQL的btree_gist扩展,为GIST索引提供等值操作支持。

步骤1:启用数据库扩展

生成空迁移文件:

python manage.py makemigrations your_app --empty

编辑生成的迁移文件,添加扩展启用逻辑:

from django.db import migrations
from django.contrib.postgres.operations import CreateExtension

class Migration(migrations.Migration):
    dependencies = [
        ('your_app', '0001_initial'),  # 替换为你的上一个迁移文件名
    ]

    operations = [
        CreateExtension("btree_gist"),
    ]

运行迁移生效:

python manage.py migrate

步骤2:添加排他约束

修改模型添加EXCLUDE约束:

from django.db import models
from django.db.models import Constraint

class YourModel(models.Model):
    custom_id = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        constraints = [
            Constraint(
                name="custom_id_daily_exclude",
                sql="EXCLUDE USING gist (custom_id WITH =, date_trunc('day', created_at) WITH =)",
            )
        ]

再次执行迁移:

python manage.py makemigrations
python manage.py migrate

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:05:32