“Django/docs/2.2.x/ref/models/indexes”的版本间差异
(autoload) |
小 (Page commit) |
||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:模型索引参考 — Django 文档}} | ||
<div id="module-django.db.models.indexes" class="section"> | <div id="module-django.db.models.indexes" class="section"> | ||
<span id="model-index-reference"></span> | <span id="model-index-reference"></span> | ||
− | = | + | = 模型索引参考 = |
− | + | 索引类简化了创建数据库索引的过程。 可以使用 [[../options#django.db.models.Options|Meta.indexes]] 选项添加它们。 本文档解释了 [[#django.db.models.Index|Index]] 的 API 参考,其中包括 [[#index-options|索引选项]] 。 | |
− | [[../options#django.db.models.Options| | ||
− | |||
− | |||
<div class="admonition-referencing-built-in-indexes admonition"> | <div class="admonition-referencing-built-in-indexes admonition"> | ||
− | + | 引用内置索引 | |
− | + | 索引在 <code>django.db.models.indexes</code> 中定义,但为了方便起见,它们被导入 [[../../../topics/db/models#module-django.db|django.db.models]]。 标准约定是使用 <code>from django.db import models</code> 并将索引称为 <code>models.<IndexClass></code>。 | |
− | |||
− | |||
− | <code>models.<IndexClass></code> | ||
第22行: | 第17行: | ||
<div id="index-options" class="section"> | <div id="index-options" class="section"> | ||
− | == | + | == Index 选项 == |
− | ; ''class'' < | + | ; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Index</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">fields</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span>'', ''<span class="n"><span class="pre">name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">db_tablespace</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">opclasses</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span>'', ''<span class="n"><span class="pre">condition</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>''<span class="sig-paren">)</span> |
− | : | + | : 在数据库中创建一个索引(B 树)。 |
<div id="fields" class="section"> | <div id="fields" class="section"> | ||
− | === | + | === fields === |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Index.</span></span><span class="sig-name descname"><span class="pre">fields</span></span> |
: | : | ||
− | + | 需要索引字段的名称列表或元组。 | |
− | + | 默认情况下,索引是按每列的升序创建的。 要为列定义降序索引,请在字段名称前添加一个连字符。 | |
− | |||
− | |||
− | + | 例如,<code>Index(fields=['headline', '-pub_date'])</code> 将使用 <code>(headline, pub_date DESC)</code> 创建 SQL。 MySQL 不支持索引排序。 在这种情况下,会创建一个降序索引作为普通索引。 | |
− | <code>(headline, pub_date DESC)</code> | ||
− | |||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | + | <span class="versionmodified changed"> 2.1 版更改: </span> 旧版本不接受元组。 | |
第54行: | 第45行: | ||
<div id="name" class="section"> | <div id="name" class="section"> | ||
− | === | + | === name === |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Index.</span></span><span class="sig-name descname"><span class="pre">name</span></span> |
: | : | ||
− | + | 索引的名称。 如果未提供 <code>name</code>,Django 将自动生成一个名称。 为了兼容不同的数据库,索引名称不能超过 30 个字符,并且不应以数字 (0-9) 或下划线 (_) 开头。 | |
− | |||
− | |||
<div class="admonition-partial-indexes-in-abstract-base-classes admonition"> | <div class="admonition-partial-indexes-in-abstract-base-classes admonition"> | ||
− | + | 抽象基类中的部分索引 | |
− | + | 您必须始终为索引指定唯一名称。 因此,您通常不能在抽象基类上指定部分索引,因为 [[../options#django.db.models.Options|Meta.indexes]] 选项由子类继承,属性值完全相同(包括 <code>name</code>)每一次。 相反,直接在子类上指定 <code>indexes</code> 选项,为每个索引提供唯一的名称。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
第80行: | 第64行: | ||
<div id="db-tablespace" class="section"> | <div id="db-tablespace" class="section"> | ||
− | === | + | === db_tablespace === |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Index.</span></span><span class="sig-name descname"><span class="pre">db_tablespace</span></span> |
: | : | ||
− | + | 用于此索引的 [[../../../topics/db/tablespaces|数据库表空间]] 的名称。 对于单字段索引,如果未提供 <code>db_tablespace</code>,则在字段的 <code>db_tablespace</code> 中创建索引。 | |
− | |||
− | |||
− | + | 如果未指定 [[../fields#django.db.models.Field|Field.db_tablespace]](或索引使用多个字段),则在模型 <code>class Meta</code> 内的 [[../options#django.db.models.Options|db_tablespace]] 选项中指定的表空间中创建索引. 如果这两个表空间都没有设置,则在与表相同的表空间中创建索引。 | |
− | |||
− | [[../options#django.db.models.Options| | ||
− | |||
− | |||
<div class="admonition seealso"> | <div class="admonition seealso"> | ||
− | + | 也可以看看 | |
− | + | 有关 PostgreSQL 特定索引的列表,请参阅 [[../../contrib/postgres/indexes#module-django.contrib.postgres|django.contrib.postgres.indexes]]。 | |
− | [[../../contrib/postgres/indexes#module-django.contrib.postgres| | ||
第108行: | 第85行: | ||
<div id="opclasses" class="section"> | <div id="opclasses" class="section"> | ||
− | === | + | === opclasses === |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Index.</span></span><span class="sig-name descname"><span class="pre">opclasses</span></span> |
: | : | ||
<div class="versionadded"> | <div class="versionadded"> | ||
+ | <span class="versionmodified added">2.2 版中的新功能。</span> | ||
</div> | </div> | ||
− | + | 用于此索引的 [https://www.postgresql.org/docs/current/indexes-opclass.html PostgreSQL 运算符类] 的名称。 如果您需要自定义运算符类,则必须为索引中的每个字段提供一个。 | |
− | |||
− | |||
− | + | 例如,<code>GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops'])</code> 使用 <code>jsonb_path_ops</code> 在 <code>jsonfield</code> 上创建一个 gin 索引。 | |
− | <code> | ||
− | <code>opclasses</code> | + | <code>opclasses</code> 对于 PostgreSQL 以外的数据库将被忽略。 |
− | [[#django.db.models.Index.name| | + | 使用 <code>opclasses</code> 时需要 [[#django.db.models.Index.name|Index.name]]。 |
第133行: | 第108行: | ||
<div id="condition" class="section"> | <div id="condition" class="section"> | ||
− | === | + | === condition === |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Index.</span></span><span class="sig-name descname"><span class="pre">condition</span></span> |
: | : | ||
<div class="versionadded"> | <div class="versionadded"> | ||
+ | <span class="versionmodified added">2.2 版中的新功能。</span> | ||
</div> | </div> | ||
− | + | 如果表非常大并且您的查询主要针对行的子集,则将索引限制为该子集可能很有用。 将条件指定为 [[../querysets#django.db.models|Q]]。 例如,<code>condition=Q(pages__gt=400)</code> 索引超过 400 页的记录。 | |
− | |||
− | [[../querysets#django.db.models| | ||
− | |||
− | [[#django.db.models.Index.name| | + | 使用 <code>condition</code> 时需要 [[#django.db.models.Index.name|Index.name]]。 |
<div class="admonition-restrictions-on-postgresql admonition"> | <div class="admonition-restrictions-on-postgresql admonition"> | ||
− | + | PostgreSQL 的限制 | |
− | PostgreSQL | + | PostgreSQL 要求将条件中引用的函数标记为 IMMUTABLE。 Django 不会验证这一点,但 PostgreSQL 会出错。 这意味着不接受诸如 [[../database-functions#date-functions|Date 函数]] 和 [[../database-functions#django.db.models.functions|Concat]] 之类的函数。 如果您将日期存储在 [[../fields#django.db.models|DateTimeField]] 中,与 <code>datetime</code> 对象的比较可能需要提供 <code>tzinfo</code> 参数,否则比较可能会由于转换 Django 而导致可变函数用于 [[../querysets#field-lookups|查找]] 。 |
− | |||
− | |||
− | [[../database-functions#django.db.models.functions| | ||
− | |||
− | <code>datetime</code> | ||
− | |||
− | |||
第167行: | 第133行: | ||
<div class="admonition-restrictions-on-sqlite admonition"> | <div class="admonition-restrictions-on-sqlite admonition"> | ||
− | + | SQLite 的限制 | |
− | SQLite [https://www.sqlite.org/partialindex.html | + | SQLite [https://www.sqlite.org/partialindex.html 对如何构建部分索引施加了限制] 。 |
− | |||
第178行: | 第143行: | ||
Oracle | Oracle | ||
− | Oracle | + | Oracle 不支持部分索引。 相反,可以使用功能索引来模拟部分索引。 使用 [[../../../topics/migrations|migration]] 使用 [[../../migration-operations#django.db.migrations.operations|RunSQL]] 添加索引。 |
− | |||
第185行: | 第149行: | ||
<div class="admonition-mysql-and-mariadb admonition"> | <div class="admonition-mysql-and-mariadb admonition"> | ||
− | MySQL | + | MySQL 和 MariaDB |
− | + | MySQL 和 MariaDB 会忽略 <code>condition</code> 参数,因为它们都不支持条件索引。 | |
− | |||
第198行: | 第161行: | ||
</div> | </div> | ||
+ | <div class="clearer"> | ||
− | [[Category:Django 2.2.x | + | |
+ | |||
+ | </div> | ||
+ | |||
+ | [[Category:Django 2.2.x 文档]] |
2021年10月31日 (日) 04:05的最新版本
模型索引参考
索引类简化了创建数据库索引的过程。 可以使用 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 选项中指定的表空间中创建索引. 如果这两个表空间都没有设置,则在与表相同的表空间中创建索引。
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 而导致可变函数用于 查找 。
MySQL 和 MariaDB
MySQL 和 MariaDB 会忽略 condition
参数,因为它们都不支持条件索引。