约束参考 — Django 文档
约束参考
此模块中定义的类创建数据库约束。 它们被添加到模型 Meta.constraints 选项中。
引用内置约束
约束在 django.db.models.constraints
中定义,但为了方便起见,它们被导入到 django.db.models 中。 标准约定是使用 from django.db import models
并将约束称为 models.<Foo>Constraint
。
抽象基类中的约束
您必须始终为约束指定唯一的名称。 因此,您通常不能在抽象基类上指定约束,因为 Meta.constraints 选项由子类继承,每个属性的值(包括 name
)完全相同时间。 为了解决名称冲突,部分名称可能包含 '%(app_label)s'
和 '%(class)s'
,分别由具体模型的小写应用程序标签和类名称替换。 例如CheckConstraint(check=Q(age__gte=18), name='%(app_label)s_%(class)s_is_adult')
。
约束验证
通常,在 full_clean()
期间检查 not 约束,并且不引发 ValidationError
。 相反,您会在 save()
上收到数据库完整性错误。 UniqueConstraint
s 没有 条件 (即 非部分唯一约束)在这方面有所不同,因为它们利用了现有的 validate_unique()
逻辑,从而实现了两阶段验证。 除了 save()
上的 IntegrityError
,当 UniqueConstraint
被违反时,在模型验证期间也会引发 ValidationError
。
CheckConstraint
- class CheckConstraint(*, check, name)
- 在数据库中创建检查约束。
check
- CheckConstraint.check
一个 Q 对象或布尔值 Expression,用于指定您希望约束强制执行的检查。
例如,CheckConstraint(check=Q(age__gte=18), name='age_gte_18')
确保年龄字段永远不会小于 18。
3.1 版更改: 添加了对布尔值 表达式 的支持。
name
- CheckConstraint.name
约束的名称。 您必须始终为约束指定唯一的名称。
3.0 版更改:添加了 '%(app_label)s'
和 '%(class)s'
的插值。
UniqueConstraint
- class UniqueConstraint(*, fields, name, condition=None, deferrable=None)
- 在数据库中创建唯一约束。
fields
- UniqueConstraint.fields
字段名称列表,用于指定您希望约束强制执行的唯一列集。
例如,UniqueConstraint(fields=['room', 'date'], name='unique_booking')
确保每个房间每个日期只能预订一次。
name
- UniqueConstraint.name
约束的名称。 您必须始终为约束指定唯一的名称。
3.0 版更改:添加了 '%(app_label)s'
和 '%(class)s'
的插值。
condition
- UniqueConstraint.condition
一个 Q 对象,指定您希望约束强制执行的条件。
例如:
UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')
确保每个用户只有一个草稿。
这些条件与 Index.condition 具有相同的数据库限制。
deferrable
- UniqueConstraint.deferrable
3.1 版中的新功能。
设置此参数以创建可延迟的唯一约束。 可接受的值为 Deferrable.DEFERRED
或 Deferrable.IMMEDIATE
。 例如:
from django.db.models import Deferrable, UniqueConstraint
UniqueConstraint(
name='unique_order',
fields=['order'],
deferrable=Deferrable.DEFERRED,
)
默认情况下不延迟约束。 在事务结束之前不会强制执行延迟约束。 立即约束将在每个命令后立即强制执行。
MySQL、MariaDB 和 SQLite。
在 MySQL、MariaDB 和 SQLite 上忽略可延迟的唯一约束,因为它们都不支持。