如何解决为什么带有sqlite的Django不将唯一约束插入数据库模式?
我开始将 Django 与 sqlite 结合使用,我想对表中两个字段的组合施加一个简单的唯一约束。为此,我使用了 Django 的 UniqueConstraint 类。但是,令我惊讶的是,该约束并未插入到数据库中的表架构中。我的 Django 模型如下所示:
from django.db import models
class Fruit(models.Model):
fruit_id = models.IntegerField(primary_key=True)
fruit_type = models.CharField(max_length=64,default='',blank=True,null=False)
fruit_name = models.CharField(max_length=128,null=False)
class Meta:
models.UniqueConstraint(fields=['fruit_type','fruit_name'],name='unique_fruit_type_name')
db_table = 'fruit'
迁移后,我通过执行以下命令检查数据库中的架构:
select sql from sqlite_master where type='table';
问题表的结果如下:
CREATE TABLE "fruit" ("fruit_id" integer NOT NULL PRIMARY KEY"fruit_type" varchar(64) NOT NULL),"fruit_name" varchar(128) NOT NULL
我期待得到:
CREATE TABLE "fruit" ("fruit_id" integer NOT NULL PRIMARY KEY"fruit_type" varchar(64) NOT NULL),"fruit_name" varchar(128) NOT NULL,UNIQUE (fruit_type,fruit_name)
UNIQUE 子句去哪儿了?它不应该在架构中吗?
解决方法
您直接在 Meta
类中编写了没有任何效果的约束。您需要将它写在 Meta
类中属性 constraints
[Django docs] 的列表中:
from django.db import models
class Fruit(models.Model):
fruit_id = models.IntegerField(primary_key=True)
fruit_type = models.CharField(max_length=64,default='',blank=True,null=False)
fruit_name = models.CharField(max_length=128,null=False)
class Meta:
constraints = [
models.UniqueConstraint(fields=['fruit_type','fruit_name'],name='unique_fruit_type_name')
]
db_table = 'fruit'
注意:确保在进行这些更改后运行 python manage.py makemigrations
和 python manage.py migrate
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。