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' ) ]
验证约束是否生效的步骤
- 重新生成迁移文件:运行
python manage.py makemigrations,你会在生成的迁移文件中看到明确的约束创建代码,类似这样:
operations = [ migrations.AddConstraint( model_name='citationvote', constraint=models.UniqueConstraint(fields=('user_who_voted', 'citation_id'), name='one_vote_pp'), ), ]
- 执行迁移:
python manage.py migrate,此时PostgreSQL数据库中就会创建对应的唯一约束,确保同一个用户对同一条引用只能投一次票。
补充说明:你选择用UniqueConstraint替代unique_together的方向是对的,Django官方确实推荐前者作为新版本的标准用法,只是这次栽在了类名大小写的小细节上。
内容的提问来源于stack exchange,提问作者kmypwn
相关产品推荐
相关产品推荐

