Skip to main content
 首页 » 编程设计

python之django: `unique=True` 会阻止 `IntegrityError` 吗

2024年08月27日29yxwkf

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

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 这样的迁移工具