模型索引参考 — Django 文档

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

模型索引参考

索引类简化了创建数据库索引的过程。 可以使用 Meta.indexes 选项添加它们。 本文档解释了 Index 的 API 参考,其中包括 索引选项 。

引用内置索引

索引在 django.db.models.indexes 中定义,但为了方便起见,它们被导入 django.db.models。 标准约定是使用 from django.db import models 并将索引称为 models.<IndexClass>。


Index 选项

class Index(fields=(), name=None, db_tablespace=None, opclasses=(), condition=None)
在数据库中创建一个索引(B 树)。

fields

Index.fields

需要索引字段的名称列表或元组。

默认情况下,索引是按每列的升序创建的。 要为列定义降序索引,请在字段名称前添加一个连字符。

例如,Index(fields=['headline', '-pub_date']) 将使用 (headline, pub_date DESC) 创建 SQL。 MySQL 不支持索引排序。 在这种情况下,会创建一个降序索引作为普通索引。

2.1 版更改: 旧版本不接受元组。


name

Index.name

索引的名称。 如果未提供 name,Django 将自动生成一个名称。 为了兼容不同的数据库,索引名称不能超过 30 个字符,并且不应以数字 (0-9) 或下划线 (_) 开头。

抽象基类中的部分索引

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


db_tablespace

Index.db_tablespace

用于此索引的 数据库表空间 的名称。 对于单字段索引,如果未提供 db_tablespace,则在字段的 db_tablespace 中创建索引。

如果未指定 Field.db_tablespace(或索引使用多个字段),则在模型 class Meta 内的 db_tablespace 选项中指定的表空间中创建索引. 如果这两个表空间都没有设置,则在与表相同的表空间中创建索引。

也可以看看

有关 PostgreSQL 特定索引的列表,请参阅 django.contrib.postgres.indexes。


opclasses

Index.opclasses

2.2 版中的新功能。


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

例如,GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops']) 使用 jsonb_path_ops 在 jsonfield 上创建一个 gin 索引。

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

使用 opclasses 时需要 Index.name。


condition

Index.condition

2.2 版中的新功能。


如果表非常大并且您的查询主要针对行的子集,则将索引限制为该子集可能很有用。 将条件指定为 Q。 例如,condition=Q(pages__gt=400) 索引超过 400 页的记录。

使用 condition 时需要 Index.name。

PostgreSQL 的限制

PostgreSQL 要求将条件中引用的函数标记为 IMMUTABLE。 Django 不会验证这一点,但 PostgreSQL 会出错。 这意味着不接受诸如 Date 函数 和 Concat 之类的函数。 如果您将日期存储在 DateTimeField 中,与 datetime 对象的比较可能需要提供 tzinfo 参数,否则比较可能会由于转换 Django 而导致可变函数用于 查找 。


SQLite 的限制

SQLite 对如何构建部分索引施加了限制 。


Oracle

Oracle 不支持部分索引。 相反,可以使用功能索引来模拟部分索引。 使用 migration 使用 RunSQL 添加索引。


MySQL 和 MariaDB

MySQL 和 MariaDB 会忽略 condition 参数,因为它们都不支持条件索引。