这是从Django的文档中摘录的:

领域唯一的

如果为True,则此字段在整个表中必须是唯一的.

这是在数据库级别和通过模型验证实现的.

这是我的模型.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,

然而,在管理方面.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.有人知道这是什么原因吗?

我使用的是定制管理器,但我怀疑这是问题所在.

谢谢

推荐答案

For django 1.9+
运行makemigrations然后运行migrate将唯一约束应用于sqlite3

For 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.)

Django相关问答推荐

如何根据递归ManyToManyField值创建Django查询集?

无法将关键字average_rating解析为字段

django优化查询

设置wagail开发环境时出现ImportError:";无法从';wagta.search;";导入名称.

SQLite上可以正常使用Many2Many链接注释,但MariaDB上无法正常使用(生产环境)

如何在 Fargate 容器中运行的 Django 中使用 AWS SES?

Django InlineModelAdmin:部分显示内联模型并链接到完整模型

如何从 json 模式创建表单?

django 在 ubuntu 中安装在哪里

Django 删除未使用的媒体文件

带有消息判断的 Django/Python assertRaises

PyCharm 无法正确识别需求 - Python、Django

Django post_save 在不覆盖模型 save() 的情况下防止递归

Django Rest Framework - 缺少静态目录

Django 应用程序中的版本号

如何在保存之前更改 Django 表单字段值?

如何在不同的元素上添加注释?

找不到 msguniq.确保您安装了 GNU gettext 工具 0.15 或更新版本. (Django 1.8 和 OSX ElCapitan)

Django 测试客户端方法覆盖标头

Django 1.7 迁移不会重新创建删除的表,为什么?