索引类易于创建数据库索引。可以使用 Meta.indexes
选择权。本文档解释了 Index
其中包括 index options .
引用内置索引
索引定义在 django.db.models.indexes
但为了方便起见,它们被进口到 django.db.models
. 标准惯例是使用 from django.db import models
并将索引引用为 models.<IndexClass>
.
Index
选项¶在数据库中创建索引(B树)。
expressions
¶位置论元 *expressions
允许在表达和数据库函数上创建功能索引。
例如::
Index(Lower("title").desc(), "pub_date", name="lower_title_date_idx")
的大小写值创建一个索引 title
字段按降序排列,而 pub_date
字段以默认升序排列。
另一个例子::
Index(F("height") * F("weight"), Round("weight"), name="calc_idx")
根据字段相乘的结果创建索引 height
和 weight
以及 weight
四舍五入到最接近的整数。
Index.name
使用时需要 *expressions
。
对Oracle的限制
Oracle要求索引中引用的函数标记为 DETERMINISTIC
. Django没有验证此点,但Oracle会出错。这意味着诸如 Random()
不被接受。
PostgreSQL限制
PostgreSQL要求索引中引用的函数和运算符标记为 IMMUTABLE
. Django不会验证这一点,但PostgreSQL会出错。这意味着诸如 Concat()
不被接受。
MySQL和Mariadb
如果使用SQL < 8.0.13和MariaDB,功能索引将被忽略,因为两者都不支持它们。
fields
¶需要索引的字段名称的列表或元组。
默认情况下,索引是按每列的升序创建的。若要为列定义降序索引,请在字段名称前添加连字符。
例如 Index(fields=['headline', '-pub_date'])
将使用以下内容创建SQL (headline, pub_date DESC)
。
马里亚布
在低于10.8的MariaDB上不支持索引排序。在这种情况下,降序索引被创建为普通索引。
name
¶索引的名称。如果 name
未提供,django将自动生成名称。为了与不同的数据库兼容,索引名称不能超过30个字符,并且不能以数字(0-9)或下划线开头 (_) .
抽象基类中的部分索引
您必须始终为索引指定唯一的名称。因此,通常不能在抽象Base上指定部分索引,因为 Meta.indexes
选项由子类继承,属性的值完全相同(包括 name
)每次。为了解决名称冲突,名称的一部分可能包含 '%(app_label)s'
和 '%(class)s'
,它们分别被具体模型的大写应用程序标签和类名称替换。例如 Index(fields=['title'], name='%(app_label)s_%(class)s_title_index')
。
db_tablespace
¶的名字 database tablespace 用于此索引。对于单字段索引,如果 db_tablespace
未提供,索引是在 db_tablespace
田野的
如果 Field.db_tablespace
未指定(或者如果索引使用多个字段),则在中指定的表空间中创建索引。 db_tablespace
模型中的选项 class Meta
. 如果这两个表空间都没有设置,那么索引将在与表相同的表空间中创建。
参见
有关PostgreSQL特定索引的列表,请参见 django.contrib.postgres.indexes
.
opclasses
¶的名称 PostgreSQL operator classes 用于此索引。如果需要自定义运算符类,则必须为索引中的每个字段提供一个。
例如, GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops'])
在上创建GIN索引 jsonfield
使用 jsonb_path_ops
.
opclasses
除了postgresql之外的数据库都被忽略。
Index.name
使用时需要 opclasses
.
condition
¶如果表很大,并且查询主要针对行的一个子集,那么将索引限制到该子集可能很有用。将条件指定为 Q
. 例如, condition=Q(pages__gt=400)
索引超过400页的记录。
Index.name
使用时需要 condition
.
PostgreSQL限制
PostgreSQL要求条件中引用的函数标记为不可变。Django没有验证,但是PostgreSQL会出错。这意味着诸如 日期函数 和 Concat
不被接受。如果你把日期储存在 DateTimeField
比较 datetime
对象可能需要 tzinfo
提供的参数,因为否则比较可能导致可变函数,因为Django的 lookups .
对sqlite的限制
SQLite imposes restrictions 关于如何构造部分索引。
甲骨文公司
Oracle不支持部分索引。相反,可以通过使用功能索引来模拟部分索引 Case
表情
MySQL和Mariadb
这个 condition
参数被MySQL和Mariadb忽略,因为它们都不支持条件索引。
include
¶要作为非关键列包含在覆盖索引中的字段名称的列表或多元组。这允许将仅索引扫描用于仅选择包含字段的查询 (include
)并仅按索引字段过滤 (fields
)。
例如::
Index(name="covering_index", fields=["headline"], include=["pub_date"])
将允许过滤 headline
,还选择 pub_date
,而仅从索引中获取数据。
vbl.使用 include
将产生比使用多列索引更小的索引,但缺点是非键列不能用于排序或过滤。
include
对于除了PostgreSQL之外的数据库来说被忽略。
Index.name
使用时需要 include
。
有关以下的更多详细信息,请参阅PostgreSQL文档 covering indexes 。
PostgreSQL限制
PostgreSQL支持覆盖B树和 GiST indexes
。PostgreSQL 14+还支持覆盖 SP-GiST indexes
。
5月 28, 2025