约束参考 — Django 文档
约束参考
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()
上收到数据库完整性错误。 UniqueConstraint
s 没有 条件 (即 非部分唯一约束)在这方面有所不同,因为它们利用了现有的 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 具有相同的数据库限制。