约束参考 — Django 文档

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

约束参考

此模块中定义的类创建数据库约束。 它们被添加到模型 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() 上收到数据库完整性错误。 UniqueConstraints 没有 条件 (即 非部分唯一约束)在这方面有所不同,因为它们利用了现有的 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

约束的名称。 您必须始终为约束指定唯一的名称。


UniqueConstraint

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

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 具有相同的数据库限制。


deferrable

UniqueConstraint.deferrable

3.1 版中的新功能。


设置此参数以创建可延迟的唯一约束。 可接受的值为 Deferrable.DEFERREDDeferrable.IMMEDIATE。 例如:

from django.db.models import Deferrable, UniqueConstraint

UniqueConstraint(
    name='unique_order',
    fields=['order'],
    deferrable=Deferrable.DEFERRED,
)

默认情况下不延迟约束。 在事务结束之前不会强制执行延迟约束。 立即约束将在每个命令后立即强制执行。

MySQL、MariaDB 和 SQLite。

在 MySQL、MariaDB 和 SQLite 上忽略可延迟的唯一约束,因为它们都不支持。


警告

延迟唯一约束可能会导致 性能损失


include

UniqueConstraint.include

3.2 版中的新功能。


要作为非键列包含在覆盖唯一索引中的字段名称的列表或元组。 这允许仅索引扫描用于仅选择包含字段 (include) 并仅按唯一字段 (fields) 过滤的查询。

例如:

UniqueConstraint(name='unique_booking', fields=['room', 'date'], include=['full_name'])

将允许过滤 roomdate,同时选择 full_name,同时仅从索引中获取数据。

include 仅在 PostgreSQL 上受支持。

非键列与 Index.include 具有相同的数据库限制。


opclasses

UniqueConstraint.opclasses

3.2 版中的新功能。


用于此唯一索引的 PostgreSQL 运算符类 的名称。 如果您需要自定义运算符类,则必须为索引中的每个字段提供一个。

例如:

UniqueConstraint(name='unique_username', fields=['username'], opclasses=['varchar_pattern_ops'])

使用 varchar_pattern_opsusername 上创建唯一索引。

opclasses 对于 PostgreSQL 以外的数据库将被忽略。