Django unique = True不工作

Luc*_*ang 34 python django

这是来自django的文档:

Field.unique

如果为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
Run Code Online (Sandbox Code Playgroud)

这是我的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,
Run Code Online (Sandbox Code Playgroud)

但是,在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).
Run Code Online (Sandbox Code Playgroud)

我正在使用mysql,django 1.5.有谁知道可能导致这种情况的原因是什么?

我正在使用自定义管理器,但我怀疑这是问题所在.

谢谢.

Sto*_*ica 43

对于django 1.9+
Running 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);
Run Code Online (Sandbox Code Playgroud)

或者,如果你不介意,你可以重新创建你的表.(放下桌子然后跑syncdb.)

  • 使用django 1.9.4,将唯一条件添加到表中(使用sqlite3) - 即使表已经创建. (3认同)