gpt4 book ai didi

python - Django unique=True 不工作

转载 作者:IT老高 更新时间:2023-10-28 21:55:13 26 4
gpt4 key购买 nike

这是来自 django 的文档:

Field.unique

If True, this field must be unique throughout the table.

This is enforced at the database level and by model validation.If you try to save a model with a duplicate value in a unique field, a django.db.IntegrityError will be raised by the model’s save() method.

这是我的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

对于 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。)

关于python - Django unique=True 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17627556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com