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

Django 3.0中UniqueConstraint约束未生效问题求助

Django UniqueConstraint 未生效的原因及修复方案

你遇到的问题其实是个极易忽略的细节错误——模型内部的配置类名写错了!

在Django的模型规则里,所有元数据配置必须放在名为Meta的内部类中(首字母大写),而你代码里写的是class meta:(全小写),Django根本不会识别这个类,自然也就不会应用你定义的UniqueConstraint约束。

修正后的完整代码

class CitationVote(models.Model):
    user_who_voted = models.ForeignKey('User', on_delete=models.CASCADE)
    vote = models.IntegerField(choices=[(-1, "down"), (1, "up")])
    timestamp_voted = models.DateTimeField()
    citation_id = models.ForeignKey('Citation', on_delete=models.CASCADE)
    
    # 注意这里是大写的Meta,这是关键修正点
    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['user_who_voted', 'citation_id'], 
                name='one_vote_pp'
            )
        ]

验证约束是否生效的步骤

  1. 重新生成迁移文件:运行python manage.py makemigrations,你会在生成的迁移文件中看到明确的约束创建代码,类似这样:
operations = [
    migrations.AddConstraint(
        model_name='citationvote',
        constraint=models.UniqueConstraint(fields=('user_who_voted', 'citation_id'), name='one_vote_pp'),
    ),
]
  1. 执行迁移:python manage.py migrate,此时PostgreSQL数据库中就会创建对应的唯一约束,确保同一个用户对同一条引用只能投一次票。

补充说明:你选择用UniqueConstraint替代unique_together的方向是对的,Django官方确实推荐前者作为新版本的标准用法,只是这次栽在了类名大小写的小细节上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:02:44