{"title":"模型 Meta 选项","version":"5.2","locale":"zh-hans","docname":"ref/models/options","url":"/zh-hans/5.2/ref/models/options/","canonical":"https://djangodocs.dev/zh-hans/5.2/ref/models/options/","summary":"本文档解释了所有可能的 元数据选项 ，你可以在模型的内部 class Meta 中为模型提供这些选项。 可用的 Meta 选项 Link to this heading # abstract Link to this heading # Options. abstract Link to this definition #…","html":"<h1>模型 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> 选项<a class=\"heading-anchor\" href=\"#model-meta-options\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>本文档解释了所有可能的 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/models/#meta-options\"><span class=\"std std-ref\">元数据选项</span></a>，你可以在模型的内部 <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Meta</span></code> 中为模型提供这些选项。</p>\n<section id=\"available-meta-options\">\n<h2>可用的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> 选项<a class=\"heading-anchor\" href=\"#available-meta-options\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"abstract\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">abstract</span></code><a class=\"heading-anchor\" href=\"#abstract\"><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.models.Options.abstract\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">abstract</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.abstract\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">abstract</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code>，这个模型将是一个 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/models/#abstract-base-classes\"><span class=\"std std-ref\">抽象基类</span></a>。</p>\n</dd></dl>\n\n</section>\n<section id=\"app-label\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code><a class=\"heading-anchor\" href=\"#app-label\"><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.models.Options.app_label\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">app_label</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.app_label\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果在 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> 中定义了一个应用程序之外的模型，它必须声明它属于哪个应用程序：</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=\"n\">app_label</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;myapp&quot;</span>\n</code></pre></div>\n<p>如果你想用 <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label.object_name</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label.model_name</span></code> 来表示一个模型，你可以分别使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">model._meta.label</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">model._meta.label_lower</span></code>。</p>\n</dd></dl>\n\n</section>\n<section id=\"base-manager-name\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">base_manager_name</span></code><a class=\"heading-anchor\" href=\"#base-manager-name\"><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.models.Options.base_manager_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">base_manager_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.base_manager_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>管理器的属性名，例如，<code class=\"docutils literal notranslate\"><span class=\"pre\">'objects'</span></code>，用于模型的 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/managers/#django.db.models.Model._base_manager\" title=\"django.db.models.Model._base_manager\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">_base_manager</span></code></a>。</p>\n</dd></dl>\n\n</section>\n<section id=\"db-table\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></code><a class=\"heading-anchor\" href=\"#db-table\"><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.models.Options.db_table\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">db_table</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.db_table\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于模型的数据库表的名称：</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=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;music_album&quot;</span>\n</code></pre></div>\n</dd></dl>\n\n<section id=\"table-names\">\n<span id=\"id1\"></span><h4>表名称<a class=\"heading-anchor\" href=\"#table-names\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>为了节省你的时间，Django 会自动从你的模型类和包含它的应用程序的名称中导出数据库表的名称。一个模型的数据库表名是通过将模型的“app label”——你在 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/django-admin/#django-admin-startapp\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">startapp</span></code></a> 中使用的名称——与模型的类名连接起来，并在两者之间加上下划线。</p>\n<p>例如，如果你有一个应用程序 <code class=\"docutils literal notranslate\"><span class=\"pre\">bookstore</span></code> （由 <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">startapp</span> <span class=\"pre\">bookstore</span></code> 创建），一个定义为 <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Book</span></code> 的模型将有一个名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">bookstore_book</span></code> 的数据库表。</p>\n<p>要覆盖数据库表名，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Meta</span></code> 中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></code> 参数。</p>\n<p>如果你的数据库表名是 SQL 的保留字，或者包含 Python 变量名中不允许的字符——特别是连字符——那也没关系。Django 会在幕后引用列名和表名。</p>\n<aside class=\"admonition-use-lowercase-table-names-for-mariadb-and-mysql admonition\">\n<p class=\"admonition-title\">在 MariaDB 和 MySQL 中使用小写的表名</p>\n<p>当你通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></code> 覆盖表名时，强烈建议你使用小写的表名，特别是当你使用 MySQL 后端时。更多细节请参见 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/databases/#mysql-notes\"><span class=\"std std-ref\">MySQL 注解</span></a>。</p>\n</aside>\n<aside class=\"admonition-table-name-quoting-for-oracle admonition\">\n<p class=\"admonition-title\">Oracle 的表名引用</p>\n<p>为了满足 Oracle 对表名的 30 个字符的限制，并符合 Oracle 数据库的惯例，Django 可能会缩短表名，并将其全部变成大写。为了防止这样的转变，使用带引号的名称作为 <code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</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=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;&quot;name_left_in_lowercase&quot;&#39;</span>\n</code></pre></div>\n<p>这样的引号也可以用在 Django 的其他支持的数据库后端，但是除了 Oracle，引号没有任何作用。更多细节请参见 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/databases/#oracle-notes\"><span class=\"std std-ref\">Oracle 注解</span></a>。</p>\n</aside>\n</section>\n</section>\n<section id=\"db-table-comment\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">db_table_comment</span></code><a class=\"heading-anchor\" href=\"#db-table-comment\"><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.models.Options.db_table_comment\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">db_table_comment</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.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>用于此模型的数据库表的注释。对于具有直接数据库访问权限但可能不查看您的 Django 代码的个人来说，这非常有用，用于文档化数据库表。例如：</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\">class</span><span class=\"w\"> </span><span class=\"nc\">Answer</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">answer</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">db_table_comment</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Question answers&quot;</span>\n</code></pre></div>\n</section>\n<section id=\"db-tablespace\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">db_tablespace</span></code><a class=\"heading-anchor\" href=\"#db-tablespace\"><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.models.Options.db_tablespace\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">db_tablespace</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.db_tablespace\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>此模型要使用的 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/tablespaces/\"><span class=\"doc\">数据库表空间</span></a> 名称。如果有设置的话，默认是项目的 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-DEFAULT_TABLESPACE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEFAULT_TABLESPACE</span></code></a> 配置。如果后端不支持表空间，则忽略此选项。</p>\n</dd></dl>\n\n</section>\n<section id=\"default-manager-name\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">default_manager_name</span></code><a class=\"heading-anchor\" href=\"#default-manager-name\"><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.models.Options.default_manager_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">default_manager_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.default_manager_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>模型的 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/managers/#django.db.models.Model._default_manager\" title=\"django.db.models.Model._default_manager\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">_default_manager</span></code></a> 管理器名称。</p>\n</dd></dl>\n\n</section>\n<section id=\"default-related-name\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">default_related_name</span></code><a class=\"heading-anchor\" href=\"#default-related-name\"><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.models.Options.default_related_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">default_related_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.default_related_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>从相关对象到这个对象的关系默认使用的名称。默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;model_name&gt;_set</span></code>。</p>\n<p>这个选项还可以设置 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/#django.db.models.ForeignKey.related_query_name\" title=\"django.db.models.ForeignKey.related_query_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_query_name</span></code></a>。</p>\n<p>由于字段的反向名称应该是唯一的，所以如果你打算对你的模型进行子类化，就要小心了。为了避免名称冲突，名称的一部分应该包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(model_name)s'</span></code>，它们分别被模型所在的应用程序的名称和模型的名称所取代，都是小写的。见 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/models/#abstract-related-name\"><span class=\"std std-ref\">抽象模型的相关名称</span></a> 段落。</p>\n</dd></dl>\n\n</section>\n<section id=\"get-latest-by\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">get_latest_by</span></code><a class=\"heading-anchor\" href=\"#get-latest-by\"><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.models.Options.get_latest_by\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_latest_by</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.get_latest_by\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>模型中的字段名或字段名列表，通常是 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></code></a>，<a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a>。这指定了在你的模型中使用的默认字段 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Manager</span></code></a> 的 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">last()</span></code> 和 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">earliest()</span></code> 方法。</p>\n<p>举例：</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=\"c1\"># Latest by ascending order_date.</span>\n<span class=\"n\">get_latest_by</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;order_date&quot;</span>\n\n<span class=\"c1\"># Latest by priority descending, order_date ascending.</span>\n<span class=\"n\">get_latest_by</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;-priority&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;order_date&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>更多内容请参见 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/querysets/#django.db.models.query.QuerySet.last\" title=\"django.db.models.query.QuerySet.last\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">last()</span></code></a> 文档。</p>\n</dd></dl>\n\n</section>\n<section id=\"managed\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">managed</span></code><a class=\"heading-anchor\" href=\"#managed\"><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.models.Options.managed\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">managed</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.managed\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，意味着 Django 会在 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> 中创建相应的数据库表，或者作为迁移的一部分，并作为 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">flush</span></code></a> 管理命令的一部分删除它们。也就是说，Django <em>管理</em> 数据库表的生命周期。</p>\n<p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>，将不对该模型进行数据库表的创建、修改或删除操作。如果该模型代表一个现有的表或一个通过其他方式创建的数据库视图，这一点很有用。这是在 <code class=\"docutils literal notranslate\"><span class=\"pre\">managed=False</span></code> 时 <em>唯一</em> 的区别。模型处理的所有其他方面都与正常情况完全相同。这包括</p>\n<ol class=\"arabic\">\n<li><p>如果不声明的话，在模型中增加一个自动主键字段。 为了避免给后面来的代码读者带来困惑，建议在使用非托管模型时，指定你所建模的数据库表的所有列。</p></li>\n<li><p>如果一个带有 <code class=\"docutils literal notranslate\"><span class=\"pre\">managed=False</span></code> 的模型包含一个 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> 指向另一个非托管模型，那么多对多连接的中间表也不会被创建。但是，一个托管模型和一个非托管模型之间的中间表会被创建。</p>\n<p>如果你需要改变这种默认行为，请将中间表创建为显式模型（根据需要设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">managed</span></code> ），并使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/#django.db.models.ManyToManyField.through\" title=\"django.db.models.ManyToManyField.through\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ManyToManyField.through</span></code></a> 属性让关系使用你的自定义模型。</p>\n</li>\n</ol>\n<p>对于涉及 <code class=\"docutils literal notranslate\"><span class=\"pre\">managed=False</span></code> 模型的测试，你要确保创建正确的表作为测试设置的一部分。</p>\n<p>如果你对改变模型类的 Python 级行为感兴趣，你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">managed=False</span></code> 并创建一个现有模型的副本。然而，对于这种情况，有一个更好的方法： <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/models/#proxy-models\"><span class=\"std std-ref\">代理模型</span></a>。</p>\n</dd></dl>\n\n</section>\n<section id=\"order-with-respect-to\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code><a class=\"heading-anchor\" href=\"#order-with-respect-to\"><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.models.Options.order_with_respect_to\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">order_with_respect_to</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.order_with_respect_to\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>使该对象可以根据给定字段（通常是 <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> ）进行排序。这可以用来使相关对象相对于父对象可排序。例如，如果一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> 与一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Question</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n    <span class=\"c1\"># ...</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Answer</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Question</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">order_with_respect_to</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;question&quot;</span>\n</code></pre></div>\n<p>当设置了 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> 时，会提供两个额外的方法来检索和设置相关对象的顺序：<code class=\"docutils literal notranslate\"><span class=\"pre\">get_RELATED_order()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">set_RELATED_order()</span></code>，其中 <code class=\"docutils literal notranslate\"><span class=\"pre\">RELATED</span></code> 是小写的模型名称。例如，假设一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> 对象有多个相关的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> 对象，返回的列表包含相关 <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> 对象的主键：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">question</span><span class=\"o\">.</span><span class=\"n\">get_answer_order</span><span class=\"p\">()</span>\n<span class=\"go\">[1, 2, 3]</span>\n</code></pre></div>\n<p>可以通过传递一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> 主键列表来设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> 对象相关的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> 对象的顺序：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">question</span><span class=\"o\">.</span><span class=\"n\">set_answer_order</span><span class=\"p\">([</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>相关的对象还会获得两个方法，<code class=\"docutils literal notranslate\"><span class=\"pre\">get_next_in_order()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_previous_in_order()</span></code>，可以用来按正确的顺序访问这些对象。假设 <code class=\"docutils literal notranslate\"><span class=\"pre\">Answer</span></code> 对象按 <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> 排序：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">answer</span> <span class=\"o\">=</span> <span class=\"n\">Answer</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">answer</span><span class=\"o\">.</span><span class=\"n\">get_next_in_order</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;Answer: 3&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">answer</span><span class=\"o\">.</span><span class=\"n\">get_previous_in_order</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;Answer: 1&gt;</span>\n</code></pre></div>\n</dd></dl>\n\n<aside class=\"admonition-order-with-respect-to-implicitly-sets-the-ordering-option admonition\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> 隐式地设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">ordering</span></code> 选项。</p>\n<p>在内部，<code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> 增加了一个名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">_order</span></code> 的额外字段／数据库列，并将模型的 <a class=\"reference internal\" href=\"#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ordering</span></code></a> 选项设置为这个字段。因此，<code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">ordering</span></code> 不能同时使用，<code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> 所添加的排序将在每次获取这个模型的对象列表时应用。</p>\n</aside>\n<aside class=\"admonition-changing-order-with-respect-to admonition\">\n<p class=\"admonition-title\">更改 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code></p>\n<p>因为 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code> 增加了一个新的数据库列，所以如果你在初始 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> 之后添加或更改 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code>，请务必进行适当的迁移。</p>\n</aside>\n</section>\n<section id=\"ordering\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">ordering</span></code><a class=\"heading-anchor\" href=\"#ordering\"><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.models.Options.ordering\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">ordering</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.ordering\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>对象的默认排序，用于获取对象列表时：</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=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;-order_date&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>这是一个字符串和／或查询表达式的元组或列表。每一个字符串都是一个字段名，前面有一个可选的“-”字头，表示降序。没有前缀“-”的字段将按升序排列。使用字符串“?”来随机排序。</p>\n<p>例如，要按 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</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=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>要按 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</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=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;-pub_date&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>要按 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 降序，然后按 <code class=\"docutils literal notranslate\"><span class=\"pre\">author</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=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;-pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;author&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>你也可以使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/expressions/\"><span class=\"doc\">查询表达式</span></a>。要按 <code class=\"docutils literal notranslate\"><span class=\"pre\">author</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">F</span>\n\n<span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">asc</span><span class=\"p\">(</span><span class=\"n\">nulls_last</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)]</span>\n</code></pre></div>\n</dd></dl>\n\n<aside class=\"admonition-default-ordering-and-group-by admonition\">\n<p class=\"admonition-title\">Default ordering and GROUP BY</p>\n<p>In <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/aggregation/#aggregation-ordering-interaction\"><span class=\"std std-ref\">GROUP BY queries</span></a> (for example,\nthose using <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a> and <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/querysets/#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a>), the\ndefault ordering is not applied.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>排序不是一个免费的操作。你添加到排序中的每个字段都会给你的数据库带来成本。你添加的每个外键都会隐式地包含其所有的默认排序。</p>\n<p>如果查询没有指定顺序，那么结果将以未指定的顺序从数据库中返回。只有当按一组字段排序时，才能保证特定的排序，这些字段唯一地标识结果中的每个对象。例如，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> 字段不是唯一的，那么按它排序就不能保证具有相同名称的对象总是以相同的顺序出现。</p>\n</aside>\n</section>\n<section id=\"permissions\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code><a class=\"heading-anchor\" href=\"#permissions\"><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.models.Options.permissions\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">permissions</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.permissions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>创建此对象时要输入权限表的额外权限。为每个模型自动创建添加、更改、删除和查看权限。这个例子指定了一个额外的权限，<code class=\"docutils literal notranslate\"><span class=\"pre\">can_deliver_pizzas</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=\"n\">permissions</span> <span class=\"o\">=</span> <span class=\"p\">[(</span><span class=\"s2\">&quot;can_deliver_pizzas&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Can deliver pizzas&quot;</span><span class=\"p\">)]</span>\n</code></pre></div>\n<p>这是一个由二元元组组成的列表或元组，格式为 <code class=\"docutils literal notranslate\"><span class=\"pre\">(permission_code,</span> <span class=\"pre\">human_readable_permission_name)</span></code>。</p>\n</dd></dl>\n\n</section>\n<section id=\"default-permissions\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">default_permissions</span></code><a class=\"heading-anchor\" href=\"#default-permissions\"><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.models.Options.default_permissions\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">default_permissions</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.default_permissions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认值为 <code class=\"docutils literal notranslate\"><span class=\"pre\">('add',</span> <span class=\"pre\">'change',</span> <span class=\"pre\">'delete',</span> <span class=\"pre\">'view')</span></code> 。你可以自定义这个列表，例如，如果你的应用不需要任何默认的权限，可以将其设置为空列表。它必须在模型创建之前通过 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> 在模型上指定，以防止任何遗漏的权限被创建。</p>\n</dd></dl>\n\n</section>\n<section id=\"proxy\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">proxy</span></code><a class=\"heading-anchor\" href=\"#proxy\"><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.models.Options.proxy\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">proxy</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.proxy\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">proxy</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code>，作为另一个模型子类的模型将被视为 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/models/#proxy-models\"><span class=\"std std-ref\">代理模型</span></a>。</p>\n</dd></dl>\n\n</section>\n<section id=\"required-db-features\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">required_db_features</span></code><a class=\"heading-anchor\" href=\"#required-db-features\"><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.models.Options.required_db_features\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">required_db_features</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.required_db_features\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>当前连接应具备的数据库特征列表，以便在迁移阶段考虑模型。例如，如果你将此列表设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">['gis_enabled']</span></code>，则模型将只在支持 GIS 的数据库上同步。在使用多个数据库后端进行测试时，跳过一些模型也很有用。避免模型之间的关系，这些模型可能会被创建，也可能不会被创建，因为 ORM 不会处理这个问题。</p>\n</dd></dl>\n\n</section>\n<section id=\"required-db-vendor\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">required_db_vendor</span></code><a class=\"heading-anchor\" href=\"#required-db-vendor\"><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.models.Options.required_db_vendor\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">required_db_vendor</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.required_db_vendor\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>本模型所特有的支持的数据库厂商名称。目前的内置厂商名称是： <code class=\"docutils literal notranslate\"><span class=\"pre\">sqlite</span></code>，<code class=\"docutils literal notranslate\"><span class=\"pre\">postgresql</span></code>，<code class=\"docutils literal notranslate\"><span class=\"pre\">mysql</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">oracle</span></code>。如果该属性不为空，且当前连接厂商与之不匹配，则该模型将不会同步。</p>\n</dd></dl>\n\n</section>\n<section id=\"select-on-save\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">select_on_save</span></code><a class=\"heading-anchor\" href=\"#select-on-save\"><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.models.Options.select_on_save\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">select_on_save</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.select_on_save\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>确定 Django 是否会使用 1.6 之前的 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.db.models.Model.save()</span></code></a> 算法。旧的算法使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> 来确定是否有一条现有的记录需要更新。新算法直接尝试 <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code>。在一些罕见的情况下，Django 看不到现有行的 <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code>。例如 PostgreSQL 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">ON</span> <span class=\"pre\">UPDATE</span></code> 触发器会返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code>。在这种情况下，即使数据库中存在一条记录，新算法最终也会进行 <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code>。</p>\n<p>通常不需要设置这个属性。默认值是 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>。</p>\n<p>关于新旧保存算法，请参见 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.db.models.Model.save()</span></code></a>。</p>\n</dd></dl>\n\n</section>\n<section id=\"indexes\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">indexes</span></code><a class=\"heading-anchor\" href=\"#indexes\"><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.models.Options.indexes\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">indexes</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.indexes\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>你想在模型上定义的 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/indexes/\"><span class=\"doc\">indexes</span></a> 的列表：</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Customer</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">indexes</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n            <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Index</span><span class=\"p\">(</span><span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">]),</span>\n            <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Index</span><span class=\"p\">(</span><span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">],</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;first_name_idx&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">]</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"unique-together\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code><a class=\"heading-anchor\" href=\"#unique-together\"><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.models.Options.unique_together\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">unique_together</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.unique_together\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"admonition-use-class-uniqueconstraint-with-the-attr-options-constraints-option-instead admonition\">\n<p class=\"admonition-title\">使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/constraints/#django.db.models.UniqueConstraint\" title=\"django.db.models.UniqueConstraint\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UniqueConstraint</span></code></a> 与 <code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">constraint</span></code> 选项代替。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/constraints/#django.db.models.UniqueConstraint\" title=\"django.db.models.UniqueConstraint\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UniqueConstraint</span></code></a> 比 <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> 提供更多的功能。<code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> 今后可能会被废弃。</p>\n</aside>\n<p>一组字段名，合起来必须是唯一的：</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=\"n\">unique_together</span> <span class=\"o\">=</span> <span class=\"p\">[[</span><span class=\"s2\">&quot;driver&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;restaurant&quot;</span><span class=\"p\">]]</span>\n</code></pre></div>\n<p>这是一个列表，这些列表在一起考虑时必须是唯一的。它 在Django 管理中使用，并在数据库级别执行（即在 <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code> 语句中包含适当的 <code class=\"docutils literal notranslate\"><span class=\"pre\">UNIQUE</span></code> 语句）。</p>\n<p>为方便起见，<code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</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=\"n\">unique_together</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;driver&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;restaurant&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> 不能包含在 <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> 中。（甚至不清楚这意味着什么！）如果需要验证与 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> 相关的唯一性，请尝试使用信号或显式的 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/#django.db.models.ManyToManyField.through\" title=\"django.db.models.ManyToManyField.through\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">through</span></code></a> 模型。</p>\n<p>在模型验证过程中，当约束条件被违反时引发的 <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> 具有 <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> 错误代码。</p>\n</dd></dl>\n\n</section>\n<section id=\"constraints\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">constraints</span></code><a class=\"heading-anchor\" href=\"#constraints\"><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.models.Options.constraints\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">constraints</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.constraints\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>你想在模型上定义的 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/constraints/\"><span class=\"doc\">约束</span></a> 列表：</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Customer</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">age</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">constraints</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n            <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CheckConstraint</span><span class=\"p\">(</span><span class=\"n\">condition</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">age__gte</span><span class=\"o\">=</span><span class=\"mi\">18</span><span class=\"p\">),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;age_gte_18&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">]</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"verbose-name\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code><a class=\"heading-anchor\" href=\"#verbose-name\"><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.models.Options.verbose_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">verbose_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.verbose_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>对象的可读名称，单数：</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=\"n\">verbose_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;pizza&quot;</span>\n</code></pre></div>\n<p>如果没有给定，Django 将使用一个 munged 版本的类名：<code class=\"docutils literal notranslate\"><span class=\"pre\">CamelCase</span></code> 变成 <code class=\"docutils literal notranslate\"><span class=\"pre\">camel</span> <span class=\"pre\">case</span></code>。</p>\n</dd></dl>\n\n</section>\n<section id=\"verbose-name-plural\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name_plural</span></code><a class=\"heading-anchor\" href=\"#verbose-name-plural\"><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.models.Options.verbose_name_plural\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">verbose_name_plural</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.verbose_name_plural\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>对象的复数名称：</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=\"n\">verbose_name_plural</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;stories&quot;</span>\n</code></pre></div>\n<p>如果没有给定，Django 将使用 <a class=\"reference internal\" href=\"#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a> + <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;s&quot;</span></code>。</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"read-only-meta-attributes\">\n<h2>只读的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> 属性<a class=\"heading-anchor\" href=\"#read-only-meta-attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"label\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">label</span></code><a class=\"heading-anchor\" href=\"#label\"><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.models.Options.label\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">label</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.label\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>对象的表示，返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label.object_name</span></code>，例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">'polls.Question'</span></code>。</p>\n</dd></dl>\n\n</section>\n<section id=\"label-lower\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">label_lower</span></code><a class=\"heading-anchor\" href=\"#label-lower\"><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.models.Options.label_lower\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Options.</span></span><span class=\"sig-name descname\"><span class=\"pre\">label_lower</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Options.label_lower\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>模型的表示，返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label.model_name</span></code>，例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">'polls.question'</span></code>。</p>\n</dd></dl>\n\n</section>\n</section>","rootId":"model-meta-options","toc":[{"title":"可用的 Meta 选项","anchor":"available-meta-options","children":[{"title":"abstract","anchor":"abstract","children":[]},{"title":"app_label","anchor":"app-label","children":[]},{"title":"base_manager_name","anchor":"base-manager-name","children":[]},{"title":"db_table","anchor":"db-table","children":[{"title":"表名称","anchor":"table-names","children":[]}]},{"title":"db_table_comment","anchor":"db-table-comment","children":[]},{"title":"db_tablespace","anchor":"db-tablespace","children":[]},{"title":"default_manager_name","anchor":"default-manager-name","children":[]},{"title":"default_related_name","anchor":"default-related-name","children":[]},{"title":"get_latest_by","anchor":"get-latest-by","children":[]},{"title":"managed","anchor":"managed","children":[]},{"title":"order_with_respect_to","anchor":"order-with-respect-to","children":[]},{"title":"ordering","anchor":"ordering","children":[]},{"title":"permissions","anchor":"permissions","children":[]},{"title":"default_permissions","anchor":"default-permissions","children":[]},{"title":"proxy","anchor":"proxy","children":[]},{"title":"required_db_features","anchor":"required-db-features","children":[]},{"title":"required_db_vendor","anchor":"required-db-vendor","children":[]},{"title":"select_on_save","anchor":"select-on-save","children":[]},{"title":"indexes","anchor":"indexes","children":[]},{"title":"unique_together","anchor":"unique-together","children":[]},{"title":"constraints","anchor":"constraints","children":[]},{"title":"verbose_name","anchor":"verbose-name","children":[]},{"title":"verbose_name_plural","anchor":"verbose-name-plural","children":[]}]},{"title":"只读的 Meta 属性","anchor":"read-only-meta-attributes","children":[{"title":"label","anchor":"label","children":[]},{"title":"label_lower","anchor":"label-lower","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/5.2/ref/"},{"docname":"ref/models/index","title":"模型","url":"/zh-hans/5.2/ref/models/"}],"prev":{"docname":"ref/models/class","title":"模型类参考","url":"/zh-hans/5.2/ref/models/class/"},"next":{"docname":"ref/models/instances","title":"模型实例参考","url":"/zh-hans/5.2/ref/models/instances/"},"formats":{"html":"/zh-hans/5.2/ref/models/options/","markdown":"/zh-hans/5.2/ref/models/options.md","json":"/zh-hans/5.2/ref/models/options.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/ref/models/options.txt","official":"https://docs.djangoproject.com/zh-hans/5.2/ref/models/options/","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"]}