django - 为什么带有 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, default='', blank=True, 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
您直接在没有效果的类中编写约束。相反,您需要将其写入类中属性constraints
[Django docs]的列表中Meta
:
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, default='', blank=True, 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
推荐阅读
- gitlab-ci - Mongo-express | 找到包 mongodb-query-parser 的补丁文件
- highcharts - Highcharts:如何删除选定的注释(动态创建的)?
- swift - 如何正确中止请求,以便之后设置 CORS 标头?
- c# - 使用 WSDL 在 C# 中通过 SOAP 发送 XML 信息
- c++ - 改进的 Perlin Noise 3D,奇怪的行为 0.5000 出现在整个部分
- ios - 在用户点击通知之前不调用 application(_:didReceiveRemoteNotification:fetchCompletionHandler)
- github - 向非 github 用户授予存储库访问权限
- javascript - 无法在节点 JS mongo db 中改变数组
- java - Can't find the page to generate the OAuth token
- typescript - Typescript - 具有已知键的键/值类型