当前位置: 首页 > 面试题库 >

Django unique =真不起作用

通京
2023-03-14
问题内容

这来自django的文档:

领域独特

如果为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

对于django <1.9,
因为您正在使用django 1.5,所以将采用此解决方案

如果unique=True在已经创建表之后添加了,则即使syncdb稍后再添加,唯一条件也不会添加到表中。

我可以确认sqlite3Django
1.5MyModel(url="blah").save()是否会在数据库中不存在唯一约束的情况下愉快地保存重复对象,这似乎与文档矛盾。

最好的解决方案是使用此命令在数据库中手动创建约束。

ALTER TABLE MyModel_mymodel ADD UNIQUE (url);

或者,如果您不介意,则可以重新创建表。(删除表,然后运行syncdb。)



 类似资料:
  • 问题内容: 我玩了一段时间,发现了一些有趣的东西: 现在,错误显而易见了,将列表转换为元组就可以像开始时一样正常工作: 现在,我的问题是:为什么第 一个参数必须是str或str前缀的元组,而不是 str前缀 的列表 ? AFAIK,其Python代码可能如下所示: 但这让我更加困惑,因为即使记住了它,列表还是元组也应该没有任何区别。我想念什么? 问题答案: 从技术上讲,没有理由不接受其他序列类型。

  • 我试图使用新的Google-service-libs在我的应用中设置AdMob广告。在Genymotion模拟器广告中一切看起来都很好。但他们没有像我的Galaxy Ace GT5830i和Android 2.3.6这样的真实设备。我不知道是什么问题。 下面是一些代码: XML: 我的Ad_Unit_Id以字符串形式保存。res/文件夹中的xml文件。 java语言: 如果您需要更多代码,请告诉我

  • 因此,我在一个控制器中有一个非常简单的代码片段,在这个代码片段中,我使用从外部文件中获取数据,它工作得很好!但是当我使用时,我会在控制台中得到一个

  • 问题内容: 阅读各种文章后,我决定不使用REGEX检查电子邮件是否有效,而仅使用PHP的内置filter_var函数。似乎正常,直到它开始告诉我一封电子邮件无效,因为我有一个号码。 即name@domain.com有效,而name2@domain.com无效。 我是否缺少某些东西或真的无效? 问题答案: PHP 5.3.3过滤器代码中使用的正则表达式基于Michael Rushton的博客中有关E

  • 问题内容: 正则表达式似乎还可以,因为第一行将子字符串正确替换为“ helloworld”,但是后者却不匹配,因为我看不到“ whynothelloworld?”。在控制台上 问题答案: 期望 整个 字符串匹配,而不仅仅是子字符串。 使用正则表达式匹配器对象的方法代替:

  • 问题内容: 我真的不明白是什么和有。 根据文档- 会将选择器和事件绑定到某种包装容器,该包装容器可在以后的时间再次用于当前和将来的项目。 如果所有新加载的内容都匹配,则会将其重新映射到第一次受限制的时间。也许我不太了解这种允诺方法。 如果包装器仍然存在,但是包装器容器中的内容已更改和/或通过加载,该怎么办?为什么事件没有像第一次绑定那样触发或起作用? 是的,我去过文档页面,只是我不完全理解他们的解