这来自django的文档:
字段唯一
如果为True,则该字段在整个表中必须是唯一的。
这是在数据库级别和模型验证中强制执行的。如果您试图在一个唯一字段中保存一个具有重复值的模型,django.db.IntegrityError将由模型的save()方法引发。
这是我的型号.py
class MyModel(models.Model):
# my pk is an auto-incrementing field
url = models.URLField("URL", unique=True)
text = models.TextField(max_length=1000)
# my model is just two fields, one pk (unique), and another unique field,
#, the url
这是我的is manage.py sqlall(我运行了syncdb)
CREATE TABLE `MyModel_mymodel` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`url` varchar(200) NOT NULL UNIQUE,
`text` varchar(1000) NOT NULL,
然而,在manage.py shell中,我可以自由地执行以下操作:
>>> from MyModel.models import MyModel
>>> MyModel().save() # it works fine!? Not even the text was checked for!
>>> MyModel(url="blah").save()
>>> MyModel(url="blah").save() # it still works!
# I checked the mysql database afterwards, the models were saved just fine, they
# however did have different PK's (auto incrementing fields).
我使用的是mysql,django 1.5。有人知道可能是什么原因造成的吗?
我正在使用自定义管理器,但我怀疑这是否是问题所在。
谢谢。
对于django 1.9+
运行makemigrations
,然后migrate
将唯一约束应用于sqlite3
对于django<1.9
由于您使用的是django 1.5,因此此解决方案将适用。
如果在创建表之后添加了unique=True
,那么即使稍后添加syncdb
,也不会将唯一条件添加到表中。
我可以用sqlite3
确认,如果数据库中不存在唯一约束,Django 1.5很乐意用MyModel(url="blah").save()
保存重复的对象,这似乎与文档相矛盾。
对您来说,最好的解决方案是使用此命令在数据库中手动创建约束。
ALTER TABLE MyModel_mymodel ADD UNIQUE (url);
或者,如果你不介意,你可以重新制作你的桌子。(放下表格,然后运行syncdb
。)
from __future__ import unicode_literals
from django.db import migrations, connection
def alter_table(apps, schema_editor):
query ="ALTER TABLE <your table> ADD UNIQUE (unique_col);"
cursor = connection.cursor()
cursor.execute(query)
cursor.close()
class Migration(migrations.Migration):
dependencies = [
('app', 'yourlastmigration'),
]
operations = [
migrations.RunPython(alter_table),
]
解决方案非常简单,只需按照他们的步骤操作即可。
1 - Dell all the files in the migration folder
2 - Then run the command "python manage.py makemigrations"
3 - Then run the command "python manage.py migrate"
或
借助一个简单的SQL lite查询添加索引示例
alter table test add index index_name(col1(255),col2(255));
添加唯一索引示例
alter table test add unique index_name(col1(255),col2(255));