约束参考 — Django 文档

来自菜鸟教程
Django/docs/2.2.x/ref/models/constraints
跳转至:导航、​搜索

约束参考

2.2 版中的新功能。


此模块中定义的类创建数据库约束。 它们被添加到模型 Meta.constraints 选项中。

引用内置约束

约束在 django.db.models.constraints 中定义,但为了方便起见,它们被导入到 django.db.models 中。 标准约定是使用 from django.db import models 并将约束称为 models.<Foo>Constraint


抽象基类中的约束

您必须始终为约束指定唯一的名称。 因此,您通常不能在抽象基类上指定约束,因为 Meta.constraints 选项由子类继承,每个属性的值(包括 name)完全相同时间。 相反,直接在子类上指定 constraints 选项,为每个约束提供唯一的名称。


约束的验证

通常,在 full_clean() 期间检查 not 约束,并且不引发 ValidationError。 相反,您会在 save() 上收到数据库完整性错误。 UniqueConstraints 没有 条件 (即 非部分唯一约束)在这方面有所不同,因为它们利用了现有的 validate_unique() 逻辑,从而实现了两阶段验证。 除了 save() 上的 IntegrityError,当 UniqueConstraint 被违反时,在模型验证期间也会引发 ValidationError


CheckConstraint

class CheckConstraint(*, check, name)
在数据库中创建一个检查约束

check

CheckConstraint.check

一个 Q 对象,指定您希望约束强制执行的检查。

例如,CheckConstraint(check=Q(age__gte=18), name='age_gte_18') 确保年龄字段永远不会小于 18。


name

CheckConstraint.name

约束的名称。


UniqueConstraint

class UniqueConstraint(*, fields, name, condition=None)
在数据库中创建一个唯一约束。

fields

UniqueConstraint.fields

一个字段名的列表,它指定了你要强制约束的唯一列集。

例如,UniqueConstraint(fields=['room', 'date'], name='unique_booking') 确保每个房间每个日期只能预订一次。


name

UniqueConstraint.name

约束的名称。


condition

UniqueConstraint.condition

一个 Q 对象,指定您希望约束强制执行的条件。

例如:

UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')

确保每个用户只有一份草稿。

这些条件与 Index.condition 具有相同的数据库限制。