这来自django的文档:
领域独特 如果为True,则此字段在整个表中必须是唯一的。 这是在数据库级别并通过模型验证强制执行的。如果尝试在唯一字段中保存具有重复值的模型,则模型的save()方法将引发django .db.IntegrityError。
领域独特
如果为True,则此字段在整个表中必须是唯一的。
这是在数据库级别并通过模型验证强制执行的。如果尝试在唯一字段中保存具有重复值的模型,则模型的save()方法将引发django .db.IntegrityError。
这是我的models.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
这是我的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
makemigrations
migrate
对于django <1.9, 因为您正在使用django 1.5,所以将采用此解决方案。
如果unique=True在已经创建表之后添加了,则即使syncdb稍后再添加,唯一条件也不会添加到表中。
unique=True
syncdb
我可以确认sqlite3Django 1.5MyModel(url="blah").save()是否会在数据库中不存在唯一约束的情况下愉快地保存重复对象,这似乎与文档矛盾。
sqlite3
MyModel(url="blah").save()
最好的解决方案是使用此命令在数据库中手动创建约束。
ALTER TABLE MyModel_mymodel ADD UNIQUE (url);
或者,如果您不介意,则可以重新创建表。(删除表,然后运行syncdb。)