{"title":"SchemaEditor","version":"6.0","locale":"zh-hans","docname":"ref/schema-editor","url":"/zh-hans/6.0/ref/schema-editor/","canonical":"https://djangodocs.dev/zh-hans/6.0/ref/schema-editor/","summary":"class BaseDatabaseSchemaEditor Link to this definition # Django 的迁移系统分为两部分，一部分是计算和存储应该运行哪些操作的逻辑（ django.db.migrations ），另一部分是将“创建模型”或“删除字段”这样的事情变成 SQL 的数据库抽象层——这是…","html":"<span id=\"schemaeditor\"></span><h1><code class=\"docutils literal notranslate\"><span class=\"pre\">SchemaEditor</span></code><a class=\"heading-anchor\" href=\"#module-django.db.backends.base.schema\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">BaseDatabaseSchemaEditor</span></span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Django 的迁移系统分为两部分，一部分是计算和存储应该运行哪些操作的逻辑（<code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.migrations</span></code>），另一部分是将“创建模型”或“删除字段”这样的事情变成 SQL 的数据库抽象层——这是 <code class=\"docutils literal notranslate\"><span class=\"pre\">SchemaEditor</span></code> 的工作。</p>\n<p>作为一个使用 Django 的普通开发者，你不太可能想直接与 <code class=\"docutils literal notranslate\"><span class=\"pre\">SchemaEditor</span></code> 进行交互，但如果你想写自己的迁移系统，或者有更高级的需求，它比写 SQL 要好得多。</p>\n<p>Django 中的每个数据库后端都提供了自己的 <code class=\"docutils literal notranslate\"><span class=\"pre\">SchemaEditor</span></code> 版本，并且总是通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.schema_editor()</span></code> 上下文管理器：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">with</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">schema_editor</span><span class=\"p\">()</span> <span class=\"k\">as</span> <span class=\"n\">schema_editor</span><span class=\"p\">:</span>\n    <span class=\"n\">schema_editor</span><span class=\"o\">.</span><span class=\"n\">delete_model</span><span class=\"p\">(</span><span class=\"n\">MyModel</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>它必须通过上下文管理器使用，因为这允许它管理诸如事务和延迟 SQL（如创建 <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> 约束）的事情。</p>\n<p>它将所有可能的操作以方法的形式展现出来，这些方法应该按照你希望的改变顺序被调用。有些可能的操作或更改类型并不是在所有的数据库中都能实现——例如，MyISAM 不支持外键约束。</p>\n<p>如果你正在为 Django 编写或维护一个第三方数据库后端，你将需要提供一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">SchemaEditor</span></code> 的实现，以便与 Django 的迁移功能一起工作——不过，只要你的数据库在使用 SQL 和关系型设计方面比较标准，你应该能够将 Django 内置的 <code class=\"docutils literal notranslate\"><span class=\"pre\">SchemaEditor</span></code> 类子类化，并对语法进行一些调整。</p>\n<section id=\"methods\">\n<h2>方法<a class=\"heading-anchor\" href=\"#methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"execute\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">execute()</span></code><a class=\"heading-anchor\" href=\"#execute\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.execute\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">execute</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">sql</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">params</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">()</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.execute\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>执行传入的 SQL 语句，如果提供参数，则执行。这是一个围绕普通数据库游标的包装器，如果用户愿意，允许捕获 SQL 语句到 <code class=\"docutils literal notranslate\"><span class=\"pre\">.sql</span></code> 文件。</p>\n</section>\n<section id=\"create-model\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">create_model()</span></code><a class=\"heading-anchor\" href=\"#create-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.create_model\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">create_model</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.create_model\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在数据库中为所提供的模型创建一个新表，以及它所需要的任何唯一约束或索引。</p>\n</section>\n<section id=\"delete-model\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">delete_model()</span></code><a class=\"heading-anchor\" href=\"#delete-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.delete_model\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">delete_model</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.delete_model\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>将模型的表连同它所拥有的任何唯一约束或索引一起在数据库中丢弃。</p>\n</section>\n<section id=\"add-index\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">add_index()</span></code><a class=\"heading-anchor\" href=\"#add-index\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.add_index\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add_index</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">index</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.add_index\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code> 的表中添加 <code class=\"docutils literal notranslate\"><span class=\"pre\">index</span></code>。</p>\n</section>\n<section id=\"remove-index\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">remove_index()</span></code><a class=\"heading-anchor\" href=\"#remove-index\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.remove_index\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">remove_index</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">index</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.remove_index\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>将 <code class=\"docutils literal notranslate\"><span class=\"pre\">index</span></code> 从 <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code> 的表中删除。</p>\n</section>\n<section id=\"rename-index\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">rename_index()</span></code><a class=\"heading-anchor\" href=\"#rename-index\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.rename_index\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">rename_index</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_index</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_index</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.rename_index\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>将 <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code> 表中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">old_index</span></code> 重命名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">new_index</span></code>。</p>\n</section>\n<section id=\"add-constraint\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">add_constraint()</span></code><a class=\"heading-anchor\" href=\"#add-constraint\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.add_constraint\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add_constraint</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">constraint</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.add_constraint\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code> 的表中添加 <code class=\"docutils literal notranslate\"><span class=\"pre\">constraint</span></code>。</p>\n</section>\n<section id=\"remove-constraint\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">remove_constraint()</span></code><a class=\"heading-anchor\" href=\"#remove-constraint\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.remove_constraint\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">remove_constraint</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">constraint</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.remove_constraint\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>将 <code class=\"docutils literal notranslate\"><span class=\"pre\">constraint</span></code> 从 <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code> 的表中删除。</p>\n</section>\n<section id=\"alter-unique-together\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">alter_unique_together()</span></code><a class=\"heading-anchor\" href=\"#alter-unique-together\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_unique_together\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">alter_unique_together</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_unique_together</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_unique_together</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_unique_together\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>改变模型的 <a class=\"reference internal\" href=\"/zh-hans/6.0/ref/models/options/#django.db.models.Options.unique_together\" title=\"django.db.models.Options.unique_together\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_together</span></code></a> 值；这将从模型的表中添加或删除唯一约束，直到它们与新的值相匹配。</p>\n</section>\n<section id=\"alter-index-together\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">alter_index_together()</span></code><a class=\"heading-anchor\" href=\"#alter-index-together\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_index_together\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">alter_index_together</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_index_together</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_index_together</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_index_together\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>更改模型的 <code class=\"docutils literal notranslate\"><span class=\"pre\">index_together</span></code> 值；这将添加或删除模型表中的索引，直到它们与新值匹配。</p>\n</section>\n<section id=\"alter-db-table\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">alter_db_table()</span></code><a class=\"heading-anchor\" href=\"#alter-db-table\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_db_table\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">alter_db_table</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_db_table</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_db_table</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_db_table\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>将模型的表从 <code class=\"docutils literal notranslate\"><span class=\"pre\">old_db_table</span></code> 改名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">new_db_table</span></code>。</p>\n</section>\n<section id=\"alter-db-table-comment\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">alter_db_table_comment()</span></code><a class=\"heading-anchor\" href=\"#alter-db-table-comment\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_db_table_comment\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">alter_db_table_comment</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_db_table_comment</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_db_table_comment</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_db_table_comment\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>将 <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code> 表的注释更改为 <code class=\"docutils literal notranslate\"><span class=\"pre\">new_db_table_comment</span></code>。</p>\n</section>\n<section id=\"alter-db-tablespace\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">alter_db_tablespace()</span></code><a class=\"heading-anchor\" href=\"#alter-db-tablespace\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_db_tablespace\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">alter_db_tablespace</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_db_tablespace</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_db_tablespace</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_db_tablespace\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>将模型的表从一个表空间移动到另一个表空间。</p>\n</section>\n<section id=\"add-field\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">add_field()</span></code><a class=\"heading-anchor\" href=\"#add-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.add_field\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add_field</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.add_field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在模型的表中添加一列（或有时是多列）来表示该字段。如果字段有 <code class=\"docutils literal notranslate\"><span class=\"pre\">db_index=True</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">unique=True</span></code>，还将添加索引或唯一约束。</p>\n<p>如果字段是 <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code>，没有 <code class=\"docutils literal notranslate\"><span class=\"pre\">through</span></code> 的值，它将不创建一列，而是制作一个表来表示这种关系。如果提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">through</span></code>，则为无操作。</p>\n<p>如果字段是 <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code>，这也会将外键约束添加到列中。</p>\n</section>\n<section id=\"remove-field\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">remove_field()</span></code><a class=\"heading-anchor\" href=\"#remove-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.remove_field\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">remove_field</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.remove_field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>从模型的表中删除代表字段的列，以及由该字段引起的任何唯一约束、外键约束或索引。</p>\n<p>如果字段是一个 ManyToManyField，没有 <code class=\"docutils literal notranslate\"><span class=\"pre\">through</span></code> 的值，它将删除为跟踪关系而创建的表。如果提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">through</span></code>，则为无操作。</p>\n</section>\n<section id=\"alter-field\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">alter_field()</span></code><a class=\"heading-anchor\" href=\"#alter-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_field\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseDatabaseSchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">alter_field</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">strict</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.alter_field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>这将模型上的字段从旧字段转换为新字段。这包括改变列的名称（<a class=\"reference internal\" href=\"/zh-hans/6.0/ref/models/fields/#django.db.models.Field.db_column\" title=\"django.db.models.Field.db_column\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_column</span></code></a> 属性），改变字段的类型（如果字段类发生变化），改变字段的 <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code> 状态，添加或删除只属于字段的唯一约束和索引，改变主键，以及改变 <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> 约束的目的地。</p>\n<p>最常见的不能做的转换是将一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> 转换为一个普通的 Field，反之亦然；Django 不能在不丢失数据的情况下这样做，所以它会拒绝这样做。相反， <a class=\"reference internal\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.remove_field\" title=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.remove_field\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">remove_field()</span></code></a> 和 <a class=\"reference internal\" href=\"#django.db.backends.base.schema.BaseDatabaseSchemaEditor.add_field\" title=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor.add_field\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">add_field()</span></code></a> 应该分别调用。</p>\n<p>如果数据库有 <code class=\"docutils literal notranslate\"><span class=\"pre\">supports_combined_alters</span></code>，Django 会尝试在一次数据库调用中尽可能多地进行这些操作；否则，它会为每一个变化发出单独的 ALTER 语句，但不会在不需要变化的地方发出 ALTER。</p>\n</section>\n</section>\n<section id=\"attributes\">\n<h2>属性<a class=\"heading-anchor\" href=\"#attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>除非另有说明，否则所有属性都应被视为只读。</p>\n<section id=\"connection\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></code><a class=\"heading-anchor\" href=\"#connection\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.schema.SchemaEditor.connection\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">SchemaEditor.</span></span><span class=\"sig-name descname\"><span class=\"pre\">connection</span></span><a class=\"heading-anchor\" href=\"#django.db.backends.base.schema.SchemaEditor.connection\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>与数据库的连接对象。连接的一个有用属性是 <code class=\"docutils literal notranslate\"><span class=\"pre\">alias</span></code>，它可以用来确定被访问的数据库的名称。</p>\n<p>这在为 <a class=\"reference internal\" href=\"/zh-hans/6.0/howto/writing-migrations/#data-migrations-and-multiple-databases\"><span class=\"std std-ref\">多数据库迁移</span></a> 进行数据迁移时很有用。</p>\n</section>\n</section>","rootId":"module-django.db.backends.base.schema","toc":[{"title":"方法","anchor":"methods","children":[{"title":"execute()","anchor":"execute","children":[]},{"title":"create_model()","anchor":"create-model","children":[]},{"title":"delete_model()","anchor":"delete-model","children":[]},{"title":"add_index()","anchor":"add-index","children":[]},{"title":"remove_index()","anchor":"remove-index","children":[]},{"title":"rename_index()","anchor":"rename-index","children":[]},{"title":"add_constraint()","anchor":"add-constraint","children":[]},{"title":"remove_constraint()","anchor":"remove-constraint","children":[]},{"title":"alter_unique_together()","anchor":"alter-unique-together","children":[]},{"title":"alter_index_together()","anchor":"alter-index-together","children":[]},{"title":"alter_db_table()","anchor":"alter-db-table","children":[]},{"title":"alter_db_table_comment()","anchor":"alter-db-table-comment","children":[]},{"title":"alter_db_tablespace()","anchor":"alter-db-tablespace","children":[]},{"title":"add_field()","anchor":"add-field","children":[]},{"title":"remove_field()","anchor":"remove-field","children":[]},{"title":"alter_field()","anchor":"alter-field","children":[]}]},{"title":"属性","anchor":"attributes","children":[{"title":"connection","anchor":"connection","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/6.0/ref/"}],"prev":{"docname":"ref/request-response","title":"请求和响应对象","url":"/zh-hans/6.0/ref/request-response/"},"next":{"docname":"ref/settings","title":"配置","url":"/zh-hans/6.0/ref/settings/"},"formats":{"html":"/zh-hans/6.0/ref/schema-editor/","markdown":"/zh-hans/6.0/ref/schema-editor.md","json":"/zh-hans/6.0/ref/schema-editor.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/ref/schema-editor.txt","official":"https://docs.djangoproject.com/zh-hans/6.0/ref/schema-editor/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}