约束参考Link to this heading

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

BaseConstraintLink to this heading

class BaseConstraint(*name, violation_error_code=None, violation_error_message=None)Link to this definition

所有约束的基类。子类必须实现 constraint_sql(), create_sql(), remove_sql()validate() 方法。

所有约束都有以下共同的参数:

nameLink to this heading

BaseConstraint.nameLink to this definition

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

violation_error_codeLink to this heading

BaseConstraint.violation_error_codeLink to this definition

模型验证 过程中引发 ValidationError 时使用的错误代码。默认值为 None

violation_error_messageLink to this heading

BaseConstraint.violation_error_messageLink to this definition

模型验证 过程中引发 ValidationError 时使用的错误消息。默认为 "违反了约束“%(name)s”"

validate()Link to this heading

BaseConstraint.validate(model, instance, exclude=None, using=DEFAULT_DB_ALIAS)Link to this definition

验证在 model 上定义的约束是否在 instance 上被遵守。这将在数据库上执行一个查询,以确保该约束被遵守。如果需要使用 exclude 列表中的字段来验证约束,则会忽略该约束。

如果违反了约束,则引发 ValidationError

这个方法必须由子类来实现。

CheckConstraintLink to this heading

class CheckConstraint(*, condition, name, violation_error_code=None, violation_error_message=None)Link to this definition

在数据库中创建一个检查约束

conditionLink to this heading

CheckConstraint.conditionLink to this definition

一个 Q 对象或布尔 Expression,用于指定你希望约束强制执行的条件检查。

例子:

Code
CheckConstraint(condition=Q(age__gte=18), name="age_gte_18")

ensures the age field is never less than 18.

UniqueConstraintLink to this heading

class UniqueConstraint(*expressions, fields=(), name=None, condition=None, deferrable=None, include=None, opclasses=(), nulls_distinct=None, violation_error_code=None, violation_error_message=None)Link to this definition

Creates a uniqueness guarantee in the database, enforced by either a unique constraint or a unique index depending on the options used.

expressionsLink to this heading

UniqueConstraint.expressionsLink to this definition

位置参数 *expressions 允许在表达式和数据库函数上创建功能性唯一约束。

例子:

Code
UniqueConstraint(Lower("name").desc(), "category", name="unique_lower_name_category")

在降序中的 name 字段的小写值和默认升序中的 category 字段上创建了一个唯一约束。

功能性唯一约束具有与 Index.expressions 相同的数据库限制。

fieldsLink to this heading

UniqueConstraint.fieldsLink to this definition

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

例子:

Code
UniqueConstraint(fields=["room", "date"], name="unique_booking")

ensures each room can only be booked once for each date.

conditionLink to this heading

UniqueConstraint.conditionLink to this definition

一个 Q 对象,用于指定你想要强制执行的约束条件。

例子:

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

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

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

deferrableLink to this heading

UniqueConstraint.deferrableLink to this definition

设置该参数,可创建一个可推迟的唯一约束。接受的值是 Deferrable.DEFERREDDeferrable.IMMEDIATE。例如:

Code
from django.db.models import Deferrable, UniqueConstraint

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

默认情况下,约束条件是不推迟的。推迟的约束条件在事务结束前不会被强制执行。即时约束将在每条命令后立即执行。

Unique constraints with condition, include, opclasses, or expressions may be implemented as unique indexes rather than unique constraints. In that case, deferrable cannot be set.

includeLink to this heading

UniqueConstraint.includeLink to this definition

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

例子:

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

将允许对 roomdate 进行过滤,也可以选择 full_name,同时只从索引中获取数据。

非主键列的唯一约束在除了 PostgreSQL 之外的数据库中被忽略。

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

opclassesLink to this heading

UniqueConstraint.opclassesLink to this definition

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

例子:

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

使用 varchar_pattern_opsusername 上创建了一个唯一索引。

opclasses 对于 PostgreSQL 以外的数据库来说是被忽略的。

nulls_distinctLink to this heading

UniqueConstraint.nulls_distinctLink to this definition

是否应该将包含 NULL 值的行视为彼此不同,而不是唯一约束覆盖它们。默认值是 None,它使用数据库默认值,在大多数后端上为 True

例子:

Code
UniqueConstraint(name="ordering", fields=["ordering"], nulls_distinct=False)

创建一个唯一约束,只允许一行在 ordering 列中存储一个 NULL 值。

非主键列的唯一约束在除了 PostgreSQL 15+ 之外的数据库中被忽略。

violation_error_codeLink to this heading

UniqueConstraint.violation_error_codeLink to this definition

The error code used when a ValidationError is raised during model validation.

Defaults to BaseConstraint.violation_error_code, when either UniqueConstraint.condition is set or UniqueConstraint.fields is not set.

If UniqueConstraint.fields is set without a UniqueConstraint.condition, defaults to the Meta.unique_together error code when there are multiple fields, and to the Field.unique error code when there is a single field.

violation_error_messageLink to this heading

UniqueConstraint.violation_error_messageLink to this definition

The error message used when a ValidationError is raised during model validation.

Defaults to BaseConstraint.violation_error_message, when either UniqueConstraint.condition is set or UniqueConstraint.fields is not set.

If UniqueConstraint.fields is set without a UniqueConstraint.condition, defaults to the Meta.unique_together error message when there are multiple fields, and to the Field.unique error message when there is a single field.