python - django: `unique=True`是否阻止 `IntegrityError`?

标签 python django

我意识到当我有一个简单的模型时:

class Category(models.Model):
    name  = models.CharField(max_length=128, unique=True)
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)

修饰符 unique=True 的效果是,当我向数据库添加一个类别(通过 HTML 表单)且该类别的实例名称已存在于数据库中时,应用程序将不会碰撞。 相反,我可以访问 form.errors 并将其打印到页面或终端。 如果我省略 unique=True 并尝试向数据库中添加名称已存在的类别,则会收到 IntegrityError 并且我的应用程序崩溃。

所以在我看来,定义unique=True对于应用程序的行为非常重要。我想那么一定还有其他同样重要的模型属性

在 django 文档中,我可以在哪里阅读有关此内容的信息以及是否还有其他此类属性?

最佳答案

首先,您使用唯一约束创建了模型,因此数据库已经具有唯一约束。类似于(对于 MySQL):

CONSTRAINT myapp_category UNIQUE (name)

现在,您可能正在使用 ModelForm,它选择此属性 unique=True,并应用该验证。因此,您可以通过 form.errors 捕获错误并妥善处理。

当您删除该属性时,数据库仍然具有约束,但 ModelForm 不会为您执行该验证,因此会出现 IntegrityError

因此,回答您的问题 - unique=True 确实有助于防止在 ModelForm 上下文中使用它时引发异常,否则您必须自己处理一下,让它优雅地失败。

要从数据库中删除unique约束,您必须使用south之类的迁移工具

关于python - django: `unique=True`是否阻止 `IntegrityError`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24633813/

相关文章:

Python __init__ 和 classmethod,它们必须具有相同数量的参数吗?

python - 如何均匀设置有限数量的标签matplotlib python

django - 如何安全地更新实时网站

django - 如何在 satchmo 中使用多个运费?

python - 在 Django 的 ORM 中使用带有 UPDATE 的子查询

python - Django:标记为已读 "Notifications"

Python:更快地处理数组

python - 无法在 "object"类的实例上设置属性

python - Django 中的 ModuleNotFound 错误。无法解决错误