为什么Django和sqlite不在数据库模式中插入唯一约束?

为什么Django和sqlite不在数据库模式中插入唯一约束?,django,sqlite,constraints,schema,unique,Django,Sqlite,Constraints,Schema,Unique,我开始将Django与sqlite结合使用,并希望对表中两个字段的组合施加一个简单的唯一约束。为此,我使用Django的UniqueConstraint类。但是,令我惊讶的是,约束没有插入到数据库中的表模式中。我的Django模型如下所示: from django.db import models class Fruit(models.Model): fruit_id = models.IntegerField(primary_key=True) fruit_type = mo

我开始将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
类中编写约束,这没有任何效果。相反,您需要将其写入
Meta
类中属性的列表中:

来自django.db导入模型的

水果类(型号.型号):
水果id=models.IntegerField(主键=True)
水果类型=models.CharField(最大长度=64,默认值=“”,空白值=True,空值=False)
fruit_name=models.CharField(最大长度=128,默认值为“”,空白值为True,空值为False)
类元:
约束=[
models.UniqueConstraint(字段=['fruit\u type','fruit\u name'],name='unique\u fruit\u type\u name')
]
db_表=‘水果’
注意:确保在进行这些更改后运行
python manage.py makemigrations
python manage.py migrate


对这就成功了。现在我得到
创建表“fruit”(“fruit\u id”integer NOT NULL主键,“fruit\u name”varchar(128)NOT NULL,“fruit\u type”varchar(64)NOT NULL,约束“unique\u fruit\u type\u name”unique(“fruit\u type”,“fruit\u name”)