{"title":"模型","version":"2.1","locale":"zh-hans","docname":"topics/db/models","url":"/zh-hans/2.1/topics/db/models/","canonical":"https://djangodocs.dev/zh-hans/2.1/topics/db/models/","summary":"模型是您的数据唯一而且准确的信息来源。它包含您正在储存的数据的重要字段和行为。一般来说，每一个模型都映射一个数据库表。 基础： 每个模型都是一个 Python 的类，这些类继承 django.db.models.Model 模型类的每个属性都相当于一个数据库的字段。 综上诉说，Django 给你一个自动生成访问数据库的…","html":"<span id=\"models\"></span><h1>模型<a class=\"heading-anchor\" href=\"#module-django.db.models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>模型是您的数据唯一而且准确的信息来源。它包含您正在储存的数据的重要字段和行为。一般来说，每一个模型都映射一个数据库表。</p>\n<p>基础：</p>\n<ul class=\"simple\">\n<li><p>每个模型都是一个 Python 的类，这些类继承 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.Model</span></code></a></p></li>\n<li><p>模型类的每个属性都相当于一个数据库的字段。</p></li>\n<li><p>综上诉说，Django 给你一个自动生成访问数据库的 API；请参阅 <a class=\"reference internal\" href=\"/zh-hans/2.1/topics/db/queries/\"><span class=\"doc\">进行查询</span></a>。</p></li>\n</ul>\n<section id=\"quick-example\">\n<h2>快速上手<a class=\"heading-anchor\" href=\"#quick-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>这个样例模型定义了一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code>, 其拥有 <code class=\"docutils literal notranslate\"><span class=\"pre\">first_name</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">last_name</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</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\">30</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\">30</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">first_name</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">last_name</span></code> <a class=\"reference internal\" href=\"#fields\">是模型的字段</a>。每个字段都被指定为一个类属性，并且每个属性映射为一个数据库列。</p>\n<p>上面的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> 模型会创建一个如下的数据库表：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"k\">CREATE</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"n\">myapp_person</span><span class=\"w\"> </span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;id&quot;</span><span class=\"w\"> </span><span class=\"nb\">serial</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"w\"> </span><span class=\"k\">PRIMARY</span><span class=\"w\"> </span><span class=\"k\">KEY</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;first_name&quot;</span><span class=\"w\"> </span><span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">30</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;last_name&quot;</span><span class=\"w\"> </span><span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">30</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span>\n<span class=\"p\">);</span>\n</code></pre></div>\n<p>一些技术上的说明：</p>\n<ul class=\"simple\">\n<li><p>该表的名称 “myapp_person” 是自动从某些模型元数据中派生出来，但可以被改写。有关更多详细信息，请参阅：<span class=\"xref std std-ref\">表命名</span>。</p></li>\n<li><p>一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> 字段会被自动添加，但是这种行为可以被改写。请参阅：<span class=\"xref std std-ref\">默认主键字段</span>。</p></li>\n<li><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code> SQL in this example is formatted using PostgreSQL\nsyntax, but it's worth noting Django uses SQL tailored to the database\nbackend specified in your <a class=\"reference internal\" href=\"/zh-hans/2.1/topics/settings/\"><span class=\"doc\">settings file</span></a>.</p></li>\n</ul>\n</section>\n<section id=\"using-models\">\n<h2>使用模型<a class=\"heading-anchor\" href=\"#using-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>一旦你定义了你的模型，你需要告诉 Django 你准备*使用*这些模型。你需要修改设置文件中的 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> ，在这个设置中添加包含你  <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> 文件的模块的名字。</p>\n<p>例如，如果模型位于你项目中的``myapp.models``中（ 此包结构使用:djadmin:manage.py startapp`命令创建），:setting:`INSTALLED_APPS 应设置如下:</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\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\">#...</span>\n    <span class=\"s1\">&#39;myapp&#39;</span><span class=\"p\">,</span>\n    <span class=\"c1\">#...</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>当你向 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> 添加新的应用的时候，请务必运行:djadmin:manage.py migrate &lt;migrate&gt;，此外你也可以先使用以下命令先进行迁移 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">makemigrations</span></code></a>。</p>\n</section>\n<section id=\"fields\">\n<h2>字段<a class=\"heading-anchor\" href=\"#fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>模型中最重要的、并且也是唯一必须的是数据库的字段定义。字段在类中定义。定义字段名时应小心避免使用与 <span class=\"xref std std-doc\">models API&lt;/ref/models/instances&gt;冲突的名称， 如 ``clean`</span>, <code class=\"docutils literal notranslate\"><span class=\"pre\">save</span></code>, or <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>delete``等.</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=\"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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Musician</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\">50</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\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">instrument</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\">Album</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\">artist</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\">Musician</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\">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\">release_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">num_stars</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n</code></pre></div>\n<section id=\"field-types\">\n<h3>字段类型<a class=\"heading-anchor\" href=\"#field-types\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>模型中每一个字段都应该是相应类的实例， Django 利用这些字段类来实现下面这些功能。</p>\n<ul class=\"simple\">\n<li><p>字段类型用以指定数据库数据类型（如：<code class=\"docutils literal notranslate\"><span class=\"pre\">INTEGER</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">TEXT</span></code>）</p></li>\n<li><p>默认的HTML表单输入框&lt;/ref/forms/widgets&gt;（如：&lt;input type=&quot;text&quot;&gt;&lt;select&gt;）</p></li>\n<li><p>用于Django admin和自动生成表单的基本验证。</p></li>\n</ul>\n<p>Django内置了多种字段类型；你可以在模型字段参考&lt;model-field-types&gt;中看到完整列表。如果Django内置类型不能满足你的需求，你可以很轻松地编写自定义的字段类型；见:doc:/howto/custom-model-fields。</p>\n</section>\n<section id=\"field-options\">\n<h3>字段选项<a class=\"heading-anchor\" href=\"#field-options\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>每一种字段都需要指定一些特定的参数（参考 <span class=\"xref std std-ref\">model field reference&lt;model-field-types&gt; ） 例如： :class:`~django.db.models.CharField</span> （以及它的子类）需要接收一个 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.CharField.max_length\" title=\"django.db.models.CharField.max_length\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">max_length</span></code></a> 参数，用以指定数据库存储数据时用的 <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> 大小。</p>\n<p>一些可选的参数是通用的，可以用于任何字段类型，详情请见 :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>reference&lt;common-model-field-options&gt; ` ，下面介绍一部分经常用到的通用参数：</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">null</span></code></a></dt><dd><p>如果设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> ， 当该字段为空时，Django会将数据库中该字段设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code> 。默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 。</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">blank</span></code></a></dt><dd><p>如果设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> ，该字段允许为空。默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 。</p>\n<p>注意该选项与 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 不同， <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">null</span></code></a> 选项仅仅是数据库层面的设置，然而 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">blank</span></code></a> 是涉及表单验证方面。如果一个字段设置为 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">blank=True</span></code></a> ，在进行表单验证时，接收的数据该字段值允许为空，而设置为 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">blank=False</span></code></a> 时，不允许为空。</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.choices\" title=\"django.db.models.Field.choices\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">choices</span></code></a></dt><dd><p>该参数接收一个可迭代的列表或元组（基本单位为二元组）。如果指定了该参数，在实例化该模型时，该字段只能取选项列表中的值。</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=\"n\">YEAR_IN_SCHOOL_CHOICES</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;FR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Freshman&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;SO&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Sophomore&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;JR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Junior&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;SR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Senior&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;GR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Graduate&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>每个二元组的第一个值会储存在数据库中，而第二个值将只会用于显示作用。</p>\n<p>对于一个模型实例，要获取该字段二元组中相对应的第二个值，使用 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/instances/#django.db.models.Model.get_FOO_display\" title=\"django.db.models.Model.get_FOO_display\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_FOO_display()</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=\"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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</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\">SHIRT_SIZES</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n        <span class=\"p\">(</span><span class=\"s1\">&#39;S&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Small&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"s1\">&#39;M&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Medium&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"s1\">&#39;L&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Large&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">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\">60</span><span class=\"p\">)</span>\n    <span class=\"n\">shirt_size</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\">1</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"n\">SHIRT_SIZES</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Fred Flintstone&quot;</span><span class=\"p\">,</span> <span class=\"n\">shirt_size</span><span class=\"o\">=</span><span class=\"s2\">&quot;L&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">shirt_size</span>\n<span class=\"go\">&#39;L&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">get_shirt_size_display</span><span class=\"p\">()</span>\n<span class=\"go\">&#39;Large&#39;</span>\n</code></pre></div>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">default</span></code></a></dt><dd><p>该字段的默认值。可以是一个值或者是个可调用的对象，如果是个可调用对象，每次实例化模型时都会调用该对象。</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.help_text\" title=\"django.db.models.Field.help_text\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">help_text</span></code></a></dt><dd><p>Extra &quot;help&quot; text to be displayed with the form widget. It's useful for\ndocumentation even if your field isn't used on a form.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">primary_key</span></code></a></dt><dd><p>如果设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> ，将该字段设置为该模型的主键。</p>\n<p>在一个模型中，如果你没有对任何一个字段设置 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">primary_key=True</span></code></a> 选项。 Django 会自动添加一个 <a class=\"reference internal\" href=\"/zh-hans/2.1/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> 字段，用于设置为主键，因此除非你想重写 Django 默认的主键设置行为，你可以不手动设置主键。详情请见 <a class=\"reference internal\" href=\"#automatic-primary-key-fields\"><span class=\"std std-ref\">自动设置主键</span></a> 。</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=\"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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Fruit</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\">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> <span class=\"n\">primary_key</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\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\">fruit</span> <span class=\"o\">=</span> <span class=\"n\">Fruit</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Apple&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">fruit</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Pear&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">fruit</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Fruit</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"n\">flat</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&#39;Apple&#39;, &#39;Pear&#39;]&gt;</span>\n</code></pre></div>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique</span></code></a></dt><dd><p>如果设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，这个字段必须在整个表中保持值唯一。</p>\n</dd>\n</dl>\n<p>再次声明，以上只是一些通用参数的简略描述。你可以在 :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>common model field option reference&lt;common-model-field-options&gt; ` 中找到完整的介绍。</p>\n</section>\n<section id=\"automatic-primary-key-fields\">\n<span id=\"id1\"></span><h3>自动设置主键<a class=\"heading-anchor\" href=\"#automatic-primary-key-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\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=\"nb\">id</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">AutoField</span><span class=\"p\">(</span><span class=\"n\">primary_key</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这是一个自增的主键。</p>\n<p>如果你想指定设置为为主键的字段， 在你想要设置为主键的字段上设置 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">primary_key=True</span></code></a> 选项。如果 Django 看到你显式的设置了 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Field.primary_key</span></code></a> ，将不会自动在表（模型）中添加 <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> 列。</p>\n<p>每个模型都需要拥有一个设置了 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">primary_key=True</span></code></a> 的字段（无论是显式的设置还是 Django 自动设置）。</p>\n</section>\n<section id=\"verbose-field-names\">\n<span id=\"id2\"></span><h3>备注名<a class=\"heading-anchor\" href=\"#verbose-field-names\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>除了  <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> ， <a class=\"reference internal\" href=\"/zh-hans/2.1/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/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> ，任何字段类型都接收一个可选的参数 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.verbose_name\" title=\"django.db.models.Field.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a>  ，如果未指定该参数值， Django 会自动使用该字段的属性名作为该参数值，并且把下划线转换为空格。</p>\n<p>在该例中：备注名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;person's</span> <span class=\"pre\">first</span> <span class=\"pre\">name&quot;</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\">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=\"s2\">&quot;person&#39;s first name&quot;</span><span class=\"p\">,</span> <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>在该例中：备注名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;first</span> <span class=\"pre\">name&quot;</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\">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\">30</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>, <a class=\"reference internal\" href=\"/zh-hans/2.1/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> and <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> 接收的第一个参数为模型的类名，后面可以添加一个 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.verbose_name\" title=\"django.db.models.Field.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</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\">poll</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n    <span class=\"n\">Poll</span><span class=\"p\">,</span>\n    <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\">verbose_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;the related poll&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"n\">sites</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Site</span><span class=\"p\">,</span> <span class=\"n\">verbose_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;list of sites&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">place</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">OneToOneField</span><span class=\"p\">(</span>\n    <span class=\"n\">Place</span><span class=\"p\">,</span>\n    <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\">verbose_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;related place&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>一般情况下不需要将 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.verbose_name\" title=\"django.db.models.Field.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a> 值首字母大写，必要时 Djanog 会自动把首字母转换为大写。</p>\n</section>\n<section id=\"relationships\">\n<h3>关联关系<a class=\"heading-anchor\" href=\"#relationships\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>显然，关系型数据库的强大之处在于各表之间的关联关系。 Django 提供了定义三种最常见的数据库关联关系的方法：多对一，多对多，一对一。</p>\n<section id=\"many-to-one-relationships\">\n<h4>Many-to-one relationships<a class=\"heading-anchor\" href=\"#many-to-one-relationships\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>定义一个多对一的关联关系，使用 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.ForeignKey</span></code></a> 类。就和其他 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> 字段类型一样，只需要在你模型中添加一个值为该类的属性。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> requires a positional argument: the class\nto which the model is related.</p>\n<p>例如，如果一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Car</span></code> 模型 有一个制造者 <code class=\"docutils literal notranslate\"><span class=\"pre\">Manufacturer</span></code> --就是说一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Manufacturer</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Manufacturer</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=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Car</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\">manufacturer</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\">Manufacturer</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</code></pre></div>\n<p>你也可以创建一个 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#recursive-relationships\"><span class=\"std std-ref\">recursive relationships</span></a> 关系（一个模型与它本身有多对一的关系）和 :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>relationships to models not yet defined &lt;lazy-relationships&gt; ` ；详情请见  :ref:<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>the model field reference &lt;ref-foreignkey&gt; ` 。</p>\n<p>建议设置 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 字段（上例中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">manufacturer</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\">class</span><span class=\"w\"> </span><span class=\"nc\">Car</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\">company_that_makes_it</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">Manufacturer</span><span class=\"p\">,</span>\n        <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=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 字段还可以接收一些其他的参数，详见 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#foreign-key-arguments\"><span class=\"std std-ref\">the model field reference</span></a> ，这些可选的参数可以更深入的规定光联关系的具体实现。</p>\n<p>For details on accessing backwards-related objects, see the\n<a class=\"reference internal\" href=\"/zh-hans/2.1/topics/db/queries/#backwards-related-objects\"><span class=\"std std-ref\">Following relationships backward example</span></a>.</p>\n<p>如要查看相关示例代码，详见 :doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>Many-to-one relationship model example &lt;/topics/db/examples/many_to_one&gt; ` 。</p>\n</aside>\n</section>\n<section id=\"many-to-many-relationships\">\n<h4>Many-to-many relationships<a class=\"heading-anchor\" href=\"#many-to-many-relationships\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>定义一个多对多的关联关系，使用 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.ManyToManyField</span></code></a> 类。就和其他 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> 字段类型一样，只需要在你模型中添加一个值为该类的属性。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.1/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> requires a positional argument: the\nclass to which the model is related.</p>\n<p>例如：如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> 含有多种 <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping``（配料）</span> <span class=\"pre\">--</span> <span class=\"pre\">也就是一种</span> <span class=\"pre\">``Topping</span></code> 可能存在于多个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> 中，并且每个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code>  含有多种 <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Topping</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=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Pizza</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=\"c1\"># ...</span>\n    <span class=\"n\">toppings</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Topping</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>和 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 类一样，你也可以创建 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#recursive-relationships\"><span class=\"std std-ref\">recursive relationships</span></a> 关系（一个对象与他本身有着多对多的关系）和 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#lazy-relationships\"><span class=\"std std-ref\">relationships to models not yet defined</span></a> 关系。</p>\n<p>建议设置 <a class=\"reference internal\" href=\"/zh-hans/2.1/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\">toppings</span></code> ）名为一个复数名词，表示所要光联的模型对象的集合。</p>\n<p>对于多对多光联关系的两个模型，可以在任何一个模型中添加 <a class=\"reference internal\" href=\"/zh-hans/2.1/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>一般来讲，应该把 <a class=\"reference internal\" href=\"/zh-hans/2.1/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\">toppings</span></code> 被放在 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> 当中（而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span></code> 中有指向 <code class=\"docutils literal notranslate\"><span class=\"pre\">pizzas</span></code> 的 <a class=\"reference internal\" href=\"/zh-hans/2.1/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\">Pizza</span></code> 的表单时用户可以选择多种配料。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<p>如要查看完整示例代码，详见 <a class=\"reference internal\" href=\"/zh-hans/2.1/topics/db/examples/many_to_many/\"><span class=\"doc\">Many-to-many relationship model example</span></a>。</p>\n</aside>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.1/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> fields also accept a number of\nextra arguments which are explained in <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#manytomany-arguments\"><span class=\"std std-ref\">the model field reference</span></a>. These options help define how the relationship\nshould work; all are optional.</p>\n</section>\n<section id=\"extra-fields-on-many-to-many-relationships\">\n<span id=\"intermediary-manytomany\"></span><h4>在多对多(many-to-many)关系中添加添加额外的属性字段<a class=\"heading-anchor\" href=\"#extra-fields-on-many-to-many-relationships\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>如果你只是想要一个类似于记录披萨和配料之间混合和搭配的简单多对多关系，标准的 <a class=\"reference internal\" href=\"/zh-hans/2.1/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>举例来讲，考虑一个需要跟踪音乐人属于哪个音乐组的应用程序。在人和他们所在的组之间有一个多对多关系，你可以使用 <a class=\"reference internal\" href=\"/zh-hans/2.1/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>对于这些情况，Django允许你指定用于控制多对多关系的模型。你可以在中间模型当中添加而外的字段。在实例化 <a class=\"reference internal\" href=\"/zh-hans/2.1/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/2.1/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<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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</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\">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\">128</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Group</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\">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\">128</span><span class=\"p\">)</span>\n    <span class=\"n\">members</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Person</span><span class=\"p\">,</span> <span class=\"n\">through</span><span class=\"o\">=</span><span class=\"s1\">&#39;Membership&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Membership</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\">person</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\">Person</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\">group</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\">Group</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\">date_joined</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">invite_reason</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\">64</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>在设置中间模型的时候，你需要显式地为多对多关系中涉及的模型指定外键。这种显式声明定义了这两个模型之间的关系。</p>\n<p>在中间模型当中有一些限制条件：</p>\n<ul class=\"simple\">\n<li><p>你的中间模型要么有且 <em>仅</em> 有一个指向源模型（我们例子当中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Group</span></code> ）的外键，要么你必须通过 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ManyToManyField.through_fields\" title=\"django.db.models.ManyToManyField.through_fields\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ManyToManyField.through_fields</span></code></a> 参数在多个外键当中手动选择一个外键，如果有多个外健且没有用 <code class=\"docutils literal notranslate\"><span class=\"pre\">through_fields</span></code> 参数选择一个的话，会出现验证错误。对于指向目标模型（我们例子当中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> ）的外键也有同样的限制。</p></li>\n<li><p>在一个用于描述模型当中自己指向自己的多对多关系的中间模型当中，可以有两个指向同一个模型的外健，但这两个外健分表代表多对多关系（不同）的两端。如果外健的个数 <em>超过</em> 两个，你必须和上面一样指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">through_fields</span></code> 参数，要不然会出现验证错误。</p></li>\n<li><p>在定义模型自己指向自己的多对多关系时，如果使用中间模型，你 <em>必须</em> 定义 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ManyToManyField.symmetrical\" title=\"django.db.models.ManyToManyField.symmetrical\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">symmetrical=False</span></code></a> （查看 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#manytomany-arguments\"><span class=\"std std-ref\">the model field reference</span></a>）。</p></li>\n</ul>\n<p>现在你已经通过中间模型完成你的 <a class=\"reference internal\" href=\"/zh-hans/2.1/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> （例子中的``Membership``），可以开始创建一些多对多关系了。你通过实例化中间模型来创建关系：</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ringo</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Ringo Starr&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">paul</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Paul McCartney&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">beatles</span> <span class=\"o\">=</span> <span class=\"n\">Group</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;The Beatles&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">m1</span> <span class=\"o\">=</span> <span class=\"n\">Membership</span><span class=\"p\">(</span><span class=\"n\">person</span><span class=\"o\">=</span><span class=\"n\">ringo</span><span class=\"p\">,</span> <span class=\"n\">group</span><span class=\"o\">=</span><span class=\"n\">beatles</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">date_joined</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1962</span><span class=\"p\">,</span> <span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"mi\">16</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">invite_reason</span><span class=\"o\">=</span><span class=\"s2\">&quot;Needed a new drummer.&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">m1</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">beatles</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Person: Ringo Starr&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ringo</span><span class=\"o\">.</span><span class=\"n\">group_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Group: The Beatles&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">m2</span> <span class=\"o\">=</span> <span class=\"n\">Membership</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">person</span><span class=\"o\">=</span><span class=\"n\">paul</span><span class=\"p\">,</span> <span class=\"n\">group</span><span class=\"o\">=</span><span class=\"n\">beatles</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">date_joined</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1960</span><span class=\"p\">,</span> <span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">invite_reason</span><span class=\"o\">=</span><span class=\"s2\">&quot;Wanted to form a band.&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">beatles</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Person: Ringo Starr&gt;, &lt;Person: Paul McCartney&gt;]&gt;</span>\n</code></pre></div>\n<p>和一般的多对多字段不同，你 <em>不能</em> 使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code>， <code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code>， 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</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=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># The following statements will not work</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">beatles</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">john</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">beatles</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;George Harrison&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">beatles</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">([</span><span class=\"n\">john</span><span class=\"p\">,</span> <span class=\"n\">paul</span><span class=\"p\">,</span> <span class=\"n\">ringo</span><span class=\"p\">,</span> <span class=\"n\">george</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>为什么？你不能简单的在 <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">Group</span></code> 之间创立关系 - 你需要指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">Membership</span></code> 模型当中需要的所有关于此关系的细节信息。因此，在使用中间模型来定义多对多关系的时候这些方法无法使用。创立这种关系的唯一办法是创建中间模型的实例。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.remove\" title=\"django.db.models.fields.related.RelatedManager.remove\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">remove()</span></code></a> 方法也因为同样的原因无法使用。举例来讲，如果通过中间模型定义的自定义中间表没有确保二元祖 <code class=\"docutils literal notranslate\"><span class=\"pre\">(model1,</span> <span class=\"pre\">model2)</span></code> 的唯一，<code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Membership</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">person</span><span class=\"o\">=</span><span class=\"n\">ringo</span><span class=\"p\">,</span> <span class=\"n\">group</span><span class=\"o\">=</span><span class=\"n\">beatles</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">date_joined</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1968</span><span class=\"p\">,</span> <span class=\"mi\">9</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">invite_reason</span><span class=\"o\">=</span><span class=\"s2\">&quot;You&#39;ve been gone for a month and we miss you.&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">beatles</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Person: Ringo Starr&gt;, &lt;Person: Paul McCartney&gt;, &lt;Person: Ringo Starr&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This will not work because it cannot tell which membership to remove</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">beatles</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"n\">ringo</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>但是，<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.clear\" title=\"django.db.models.fields.related.RelatedManager.clear\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">clear()</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=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Beatles have broken up</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">beatles</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">clear</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Note that this deletes the intermediate model instances</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Membership</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n</code></pre></div>\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\"># Find all the groups with a member whose name starts with &#39;Paul&#39;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Group</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">members__name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;Paul&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Group</span><span class=\"p\">:</span> <span class=\"n\">The</span> <span class=\"n\">Beatles</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n</code></pre></div>\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\"># Find all the members of the Beatles that joined after 1 Jan 1961</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n<span class=\"o\">...</span>     <span class=\"n\">group__name</span><span class=\"o\">=</span><span class=\"s1\">&#39;The Beatles&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>     <span class=\"n\">membership__date_joined__gt</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1961</span><span class=\"p\">,</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Person</span><span class=\"p\">:</span> <span class=\"n\">Ringo</span> <span class=\"n\">Starr</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n</code></pre></div>\n<p>如果你想访问一个关系的信息时你可以直接查询 <code class=\"docutils literal notranslate\"><span class=\"pre\">Membership</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ringos_membership</span> <span class=\"o\">=</span> <span class=\"n\">Membership</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=\"n\">group</span><span class=\"o\">=</span><span class=\"n\">beatles</span><span class=\"p\">,</span> <span class=\"n\">person</span><span class=\"o\">=</span><span class=\"n\">ringo</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ringos_membership</span><span class=\"o\">.</span><span class=\"n\">date_joined</span>\n<span class=\"go\">datetime.date(1962, 8, 16)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ringos_membership</span><span class=\"o\">.</span><span class=\"n\">invite_reason</span>\n<span class=\"go\">&#39;Needed a new drummer.&#39;</span>\n</code></pre></div>\n<p>另一种访问同样信息的方法是通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> 对象来查询 ref:many-to-many reverse relationship&lt;m2m-reverse-relationships&gt; ：</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ringos_membership</span> <span class=\"o\">=</span> <span class=\"n\">ringo</span><span class=\"o\">.</span><span class=\"n\">membership_set</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">group</span><span class=\"o\">=</span><span class=\"n\">beatles</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ringos_membership</span><span class=\"o\">.</span><span class=\"n\">date_joined</span>\n<span class=\"go\">datetime.date(1962, 8, 16)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ringos_membership</span><span class=\"o\">.</span><span class=\"n\">invite_reason</span>\n<span class=\"go\">&#39;Needed a new drummer.&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"one-to-one-relationships\">\n<h4>One-to-one relationships<a class=\"heading-anchor\" href=\"#one-to-one-relationships\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>使用 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> 来定义一对一关系。就像使用其他类型的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> 一样：在模型属性中包含它。</p>\n<p>当一个对象以某种方式“扩展”另一个对象时，这对该对象的主键非常有用。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> 需要一个位置参数：与模型相关的类。</p>\n<p>例如，当你要建立一个有关“位置”信息的数据库时，你可能会包含通常的地址，电话等字段。接着，如果你想接着建立一个关于关于餐厅的数据库，除了将位置数据库当中的字段复制到 <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code> 模型，你也可以将一个指向 <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> 放到 <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code> 当中（因为餐厅“是一个”地点）；事实上，在处理这样的情况时最好使用 <a class=\"reference internal\" href=\"#model-inheritance\"><span class=\"std std-ref\">inheritance</span></a> ，它隐含的包括了一个一对一关系。</p>\n<p>和  <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 一样，可以创建 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#recursive-relationships\"><span class=\"std std-ref\">recursive relationship</span></a> 也可以创建 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#lazy-relationships\"><span class=\"std std-ref\">references to as-yet undefined models</span></a> 。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<p>点击文档 <a class=\"reference internal\" href=\"/zh-hans/2.1/topics/db/examples/one_to_one/\"><span class=\"doc\">One-to-one relationship model example</span></a> 来查看完整的例子。</p>\n</aside>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> 字段还接受一个可选的 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField.parent_link\" title=\"django.db.models.OneToOneField.parent_link\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">parent_link</span></code></a> 参数。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> 类通常自动的成为模型的主键，这条规则现在不再使用了（然而你可以手动指定 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">primary_key</span></code></a> 参数）。因此，现在可以在单个模型当中指定多个 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> 字段。</p>\n</section>\n</section>\n<section id=\"models-across-files\">\n<h3>跨文件模型<a class=\"heading-anchor\" href=\"#models-across-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\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=\"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<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">geography.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ZipCode</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Restaurant</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=\"c1\"># ...</span>\n    <span class=\"n\">zip_code</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">ZipCode</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">SET_NULL</span><span class=\"p\">,</span>\n        <span class=\"n\">blank</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">null</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"field-name-restrictions\">\n<h3>字段命名限制<a class=\"heading-anchor\" href=\"#field-name-restrictions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django在模型字段命名方面仅有两个限制。</p>\n<ol class=\"arabic\">\n<li><p>一个字段的名称不能是Python保留字，因为这回导致Python语法错误。比如：</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\">Example</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=\"k\">pass</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span> <span class=\"c1\"># &#39;pass&#39; is a reserved word!</span>\n</code></pre></div>\n</li>\n<li><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\">Example</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\">foo__bar</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span> <span class=\"c1\"># &#39;foo__bar&#39; has two underscores!</span>\n</code></pre></div>\n</li>\n</ol>\n<p>但是，这些限制是可以被解决的，因为字段名没要求和数据库列名一样。查看 <a class=\"reference internal\" href=\"/zh-hans/2.1/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> 选项。</p>\n<p>SQL保留字，例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">join</span></code>， <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code>， <em>是</em> 可以被用在模型字段名当中的，因为Django在对底层的SQL查询当中清洗了所有的数据库表名和字段名，通过使用特定数据库引擎的引用语法。</p>\n</section>\n<section id=\"custom-field-types\">\n<h3>自定义的字段类型<a class=\"heading-anchor\" href=\"#custom-field-types\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果已经存在的模型字段不能满足你的需求，或者你希望支持一些不太常见的数据库列类型，你可以创建自己的字段类。在 :doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>/howto/custom-model-fields 中提供了创建自己的字段的各方面内容。</p>\n</section>\n</section>\n<section id=\"meta-options\">\n<span id=\"id3\"></span><h2><code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> 选项<a class=\"heading-anchor\" href=\"#meta-options\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>使用内部 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta类</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Ox</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\">horn_length</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\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;horn_length&quot;</span><span class=\"p\">]</span>\n        <span class=\"n\">verbose_name_plural</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;oxen&quot;</span>\n</code></pre></div>\n<p>模型的元数据是指“所有不是字段的东西”，比如排序选项（attr:~Options.ordering），数据库表名（<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/options/#django.db.models.Options.db_table\" title=\"django.db.models.Options.db_table\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_table</span></code></a>），或是人可读的单复数名（<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/options/#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> 和 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/options/#django.db.models.Options.verbose_name_plural\" title=\"django.db.models.Options.verbose_name_plural\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name_plural</span></code></a>）。都不是必须的，并且在模型当中添加 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta类</span></code> 也完全是可选的。</p>\n<p>在 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/options/\"><span class=\"doc\">model option reference</span></a> 中列出了 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> 可使用的全部选项。</p>\n</section>\n<section id=\"model-attributes\">\n<span id=\"id4\"></span><h2>模型属性<a class=\"heading-anchor\" href=\"#model-attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code></dt><dd><p>模型当中最重要的属性是 <a class=\"reference internal\" href=\"/zh-hans/2.1/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>。它是Django模型和数据库查询操作之间的接口，并且它被用作从数据库当中 <a class=\"reference internal\" href=\"/zh-hans/2.1/topics/db/queries/#retrieving-objects\"><span class=\"std std-ref\">retrieve the instances</span></a>，如果没有指定自定义的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> 默认名称是 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/class/#django.db.models.Model.objects\" title=\"django.db.models.Model.objects\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">objects</span></code></a>。Manager只能通过模型类来访问，不能通过模型实例来访问。</p>\n</dd>\n</dl>\n</section>\n<section id=\"model-methods\">\n<span id=\"id5\"></span><h2>模型方法<a class=\"heading-anchor\" href=\"#model-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Define custom methods on a model to add custom &quot;row-level&quot; functionality to your\nobjects. Whereas <a class=\"reference internal\" href=\"/zh-hans/2.1/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> methods are intended to do\n&quot;table-wide&quot; things, model methods should act on a particular model instance.</p>\n<p>This is a valuable technique for keeping business logic in one place -- the\nmodel.</p>\n<p>For example, this model has a few custom methods:</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</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\">50</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\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">birth_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">baby_boomer_status</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"s2\">&quot;Returns the person&#39;s baby-boomer status.&quot;</span>\n        <span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">birth_date</span> <span class=\"o\">&lt;</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1945</span><span class=\"p\">,</span> <span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;Pre-boomer&quot;</span>\n        <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">birth_date</span> <span class=\"o\">&lt;</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1965</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;Baby boomer&quot;</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;Post-boomer&quot;</span>\n\n    <span class=\"nd\">@property</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">full_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"s2\">&quot;Returns the person&#39;s full name.&quot;</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;</span><span class=\"si\">%s</span><span class=\"s1\"> </span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">first_name</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">last_name</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>The last method in this example is a <a class=\"reference internal\" href=\"/zh-hans/2.1/glossary/#term-property\"><span class=\"xref std std-term\">property</span></a>.</p>\n<p>The <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/instances/\"><span class=\"doc\">model instance reference</span></a> has a complete list\nof <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/instances/#model-instance-methods\"><span class=\"std std-ref\">methods automatically given to each model</span></a>.\nYou can override most of these -- see <a class=\"reference internal\" href=\"#overriding-predefined-model-methods\">overriding predefined model methods</a>,\nbelow -- but there are a couple that you'll almost always want to define:</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()</span></code></a></dt><dd><p>A Python &quot;magic method&quot; that returns a string representation of any\nobject. This is what Python and Django will use whenever a model\ninstance needs to be coerced and displayed as a plain string. Most\nnotably, this happens when you display an object in an interactive\nconsole or in the admin.</p>\n<p>You'll always want to define this method; the default isn't very helpful\nat all.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/instances/#django.db.models.Model.get_absolute_url\" title=\"django.db.models.Model.get_absolute_url\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code></a></dt><dd><p>This tells Django how to calculate the URL for an object. Django uses\nthis in its admin interface, and any time it needs to figure out a URL\nfor an object.</p>\n<p>Any object that has a URL that uniquely identifies it should define this\nmethod.</p>\n</dd>\n</dl>\n<section id=\"overriding-predefined-model-methods\">\n<span id=\"overriding-model-methods\"></span><h3>Overriding predefined model methods<a class=\"heading-anchor\" href=\"#overriding-predefined-model-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>There's another set of <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/instances/#model-instance-methods\"><span class=\"std std-ref\">model methods</span></a> that\nencapsulate a bunch of database behavior that you'll want to customize. In\nparticular you'll often want to change the way <a class=\"reference internal\" href=\"/zh-hans/2.1/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\">save()</span></code></a> and\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/instances/#django.db.models.Model.delete\" title=\"django.db.models.Model.delete\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete()</span></code></a> work.</p>\n<p>You're free to override these methods (and any other model method) to alter\nbehavior.</p>\n<p>A classic use-case for overriding the built-in methods is if you want something\nto happen whenever you save an object. For example (see\n<a class=\"reference internal\" href=\"/zh-hans/2.1/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\">save()</span></code></a> for documentation of the parameters it accepts):</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Blog</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\">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\">tagline</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\">def</span><span class=\"w\"> </span><span class=\"nf\">save</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">do_something</span><span class=\"p\">()</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>  <span class=\"c1\"># Call the &quot;real&quot; save() method.</span>\n        <span class=\"n\">do_something_else</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>You can also prevent saving:</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Blog</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\">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\">tagline</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\">def</span><span class=\"w\"> </span><span class=\"nf\">save</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;Yoko Ono&#39;s blog&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"c1\"># Yoko shall never have her own blog!</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>  <span class=\"c1\"># Call the &quot;real&quot; save() method.</span>\n</code></pre></div>\n<p>It's important to remember to call the superclass method -- that's\nthat <code class=\"docutils literal notranslate\"><span class=\"pre\">super().save(*args,</span> <span class=\"pre\">**kwargs)</span></code> business -- to ensure\nthat the object still gets saved into the database. If you forget to\ncall the superclass method, the default behavior won't happen and the\ndatabase won't get touched.</p>\n<p>It's also important that you pass through the arguments that can be\npassed to the model method -- that's what the <code class=\"docutils literal notranslate\"><span class=\"pre\">*args,</span> <span class=\"pre\">**kwargs</span></code> bit\ndoes. Django will, from time to time, extend the capabilities of\nbuilt-in model methods, adding new arguments. If you use <code class=\"docutils literal notranslate\"><span class=\"pre\">*args,</span>\n<span class=\"pre\">**kwargs</span></code> in your method definitions, you are guaranteed that your\ncode will automatically support those arguments when they are added.</p>\n<aside class=\"admonition-overridden-model-methods-are-not-called-on-bulk-operations admonition\">\n<p class=\"admonition-title\">Overridden model methods are not called on bulk operations</p>\n<p>Note that the <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/instances/#django.db.models.Model.delete\" title=\"django.db.models.Model.delete\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete()</span></code></a> method for an object is not\nnecessarily called when <a class=\"reference internal\" href=\"/zh-hans/2.1/topics/db/queries/#topics-db-queries-delete\"><span class=\"std std-ref\">deleting objects in bulk using a\nQuerySet</span></a> or as a result of a <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">cascading</span>\n<span class=\"pre\">delete</span></code></a>. To ensure customized\ndelete logic gets executed, you can use\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/signals/#django.db.models.signals.pre_delete\" title=\"django.db.models.signals.pre_delete\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_delete</span></code></a> and/or\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/signals/#django.db.models.signals.post_delete\" title=\"django.db.models.signals.post_delete\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_delete</span></code></a> signals.</p>\n<p>Unfortunately, there isn't a workaround when\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create\" title=\"django.db.models.query.QuerySet.bulk_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">creating</span></code></a> or\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/querysets/#django.db.models.query.QuerySet.update\" title=\"django.db.models.query.QuerySet.update\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">updating</span></code></a> objects in bulk,\nsince none of <a class=\"reference internal\" href=\"/zh-hans/2.1/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\">save()</span></code></a>,\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_save</span></code></a>, and\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_save</span></code></a> are called.</p>\n</aside>\n</section>\n<section id=\"executing-custom-sql\">\n<h3>Executing custom SQL<a class=\"heading-anchor\" href=\"#executing-custom-sql\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Another common pattern is writing custom SQL statements in model methods and\nmodule-level methods. For more details on using raw SQL, see the documentation\non <a class=\"reference internal\" href=\"/zh-hans/2.1/topics/db/sql/\"><span class=\"doc\">using raw SQL</span></a>.</p>\n</section>\n</section>\n<section id=\"model-inheritance\">\n<span id=\"id6\"></span><h2>模型继承<a class=\"heading-anchor\" href=\"#model-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>模型继承在 Django 中与普通类继承在 Python 中的工作方式几乎完全相同, 但也仍应遵循本页开头的内容. 这意味着其基类应该继承自 <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.Model</span></code></a> .</p>\n<p>The only decision you have to make is whether you want the parent models to be\nmodels in their own right (with their own database tables), or if the parents\nare just holders of common information that will only be visible through the\nchild models.</p>\n<p>There are three styles of inheritance that are possible in Django.</p>\n<ol class=\"arabic simple\">\n<li><p>Often, you will just want to use the parent class to hold information that\nyou don't want to have to type out for each child model. This class isn't\ngoing to ever be used in isolation, so <a class=\"reference internal\" href=\"#abstract-base-classes\"><span class=\"std std-ref\">Abstract base classes</span></a> are\nwhat you're after.</p></li>\n<li><p>If you're subclassing an existing model (perhaps something from another\napplication entirely) and want each model to have its own database table,\n<a class=\"reference internal\" href=\"#multi-table-inheritance\"><span class=\"std std-ref\">Multi-table inheritance</span></a> is the way to go.</p></li>\n<li><p>Finally, if you only want to modify the Python-level behavior of a model,\nwithout changing the models fields in any way, you can use\n<a class=\"reference internal\" href=\"#proxy-models\"><span class=\"std std-ref\">Proxy models</span></a>.</p></li>\n</ol>\n<section id=\"abstract-base-classes\">\n<span id=\"id7\"></span><h3>Abstract base classes<a class=\"heading-anchor\" href=\"#abstract-base-classes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Abstract base classes are useful when you want to put some common\ninformation into a number of other models. You write your base class\nand put <code class=\"docutils literal notranslate\"><span class=\"pre\">abstract=True</span></code> in the <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a>\nclass. This model will then not be used to create any database\ntable. Instead, when it is used as a base class for other models, its\nfields will be added to those of the child class.</p>\n<p>An example:</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CommonInfo</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\">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\">age</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">PositiveIntegerField</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\">abstract</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Student</span><span class=\"p\">(</span><span class=\"n\">CommonInfo</span><span class=\"p\">):</span>\n    <span class=\"n\">home_group</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\">5</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">Student</span></code> model will have three fields: <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">age</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">home_group</span></code>. The <code class=\"docutils literal notranslate\"><span class=\"pre\">CommonInfo</span></code> model cannot be used as a normal Django\nmodel, since it is an abstract base class. It does not generate a database\ntable or have a manager, and cannot be instantiated or saved directly.</p>\n<p>Fields inherited from abstract base classes can be overridden with another\nfield or value, or be removed with <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>.</p>\n<p>For many uses, this type of model inheritance will be exactly what you want.\nIt provides a way to factor out common information at the Python level, while\nstill only creating one database table per child model at the database level.</p>\n<section id=\"meta-inheritance\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> inheritance<a class=\"heading-anchor\" href=\"#meta-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>When an abstract base class is created, Django makes any <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a>\ninner class you declared in the base class available as an\nattribute. If a child class does not declare its own <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a>\nclass, it will inherit the parent's <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a>. If the child wants to\nextend the parent's <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> class, it can subclass it. For example:</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CommonInfo</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=\"c1\"># ...</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">abstract</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n        <span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Student</span><span class=\"p\">(</span><span class=\"n\">CommonInfo</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">(</span><span class=\"n\">CommonInfo</span><span class=\"o\">.</span><span class=\"n\">Meta</span><span class=\"p\">):</span>\n        <span class=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;student_info&#39;</span>\n</code></pre></div>\n<p>Django does make one adjustment to the <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> class of an abstract base\nclass: before installing the <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> attribute, it sets <code class=\"docutils literal notranslate\"><span class=\"pre\">abstract=False</span></code>.\nThis means that children of abstract base classes don't automatically become\nabstract classes themselves. Of course, you can make an abstract base class\nthat inherits from another abstract base class. You just need to remember to\nexplicitly set <code class=\"docutils literal notranslate\"><span class=\"pre\">abstract=True</span></code> each time.</p>\n<p>Some attributes won't make sense to include in the <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> class of an\nabstract base class. For example, including <code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></code> would mean that all\nthe child classes (the ones that don't specify their own <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a>) would use\nthe same database table, which is almost certainly not what you want.</p>\n</section>\n<section id=\"be-careful-with-related-name-and-related-query-name\">\n<span id=\"abstract-related-name\"></span><h4>Be careful with <code class=\"docutils literal notranslate\"><span class=\"pre\">related_name</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">related_query_name</span></code><a class=\"heading-anchor\" href=\"#be-careful-with-related-name-and-related-query-name\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>If you are using <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a> or\n<a class=\"reference internal\" href=\"/zh-hans/2.1/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> on a <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code>, you must always specify a <em>unique</em> reverse name and query\nname for the field. This would normally cause a problem in abstract base\nclasses, since the fields on this class are included into each of the child\nclasses, with exactly the same values for the attributes (including\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a> and\n<a class=\"reference internal\" href=\"/zh-hans/2.1/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>) each time.</p>\n<p>To work around this problem, when you are using\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a> or\n<a class=\"reference internal\" href=\"/zh-hans/2.1/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> in an abstract base\nclass (only), part of the value should contain <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'%(class)s'</span></code>.</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'%(class)s'</span></code> is replaced by the lower-cased name of the child class\nthat the field is used in.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> is replaced by the lower-cased name of the app the child\nclass is contained within. Each installed application name must be unique\nand the model class names within each app must also be unique, therefore the\nresulting name will end up being different.</p></li>\n</ul>\n<p>For example, given an app <code class=\"docutils literal notranslate\"><span class=\"pre\">common/models.py</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Base</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\">m2m</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span>\n        <span class=\"n\">OtherModel</span><span class=\"p\">,</span>\n        <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;</span><span class=\"si\">%(app_label)s</span><span class=\"s2\">_</span><span class=\"si\">%(class)s</span><span class=\"s2\">_related&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">related_query_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;</span><span class=\"si\">%(app_label)s</span><span class=\"s2\">_</span><span class=\"si\">%(class)s</span><span class=\"s2\">s&quot;</span><span class=\"p\">,</span>\n    <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\">abstract</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildA</span><span class=\"p\">(</span><span class=\"n\">Base</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildB</span><span class=\"p\">(</span><span class=\"n\">Base</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Along with another app <code class=\"docutils literal notranslate\"><span class=\"pre\">rare/models.py</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\">common.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Base</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildB</span><span class=\"p\">(</span><span class=\"n\">Base</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>The reverse name of the <code class=\"docutils literal notranslate\"><span class=\"pre\">common.ChildA.m2m</span></code> field will be\n<code class=\"docutils literal notranslate\"><span class=\"pre\">common_childa_related</span></code> and the reverse query name will be <code class=\"docutils literal notranslate\"><span class=\"pre\">common_childas</span></code>.\nThe reverse name of the <code class=\"docutils literal notranslate\"><span class=\"pre\">common.ChildB.m2m</span></code> field will be\n<code class=\"docutils literal notranslate\"><span class=\"pre\">common_childb_related</span></code> and the reverse query name will be\n<code class=\"docutils literal notranslate\"><span class=\"pre\">common_childbs</span></code>. Finally, the reverse name of the <code class=\"docutils literal notranslate\"><span class=\"pre\">rare.ChildB.m2m</span></code> field\nwill be <code class=\"docutils literal notranslate\"><span class=\"pre\">rare_childb_related</span></code> and the reverse query name will be\n<code class=\"docutils literal notranslate\"><span class=\"pre\">rare_childbs</span></code>. It's up to you how you use the <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(class)s'</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> portion to construct your related name or related query name\nbut if you forget to use it, Django will raise errors when you perform system\nchecks (or run <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a>).</p>\n<p>If you don't specify a <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a>\nattribute for a field in an abstract base class, the default reverse name will\nbe the name of the child class followed by <code class=\"docutils literal notranslate\"><span class=\"pre\">'_set'</span></code>, just as it normally\nwould be if you'd declared the field directly on the child class. For example,\nin the above code, if the <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a>\nattribute was omitted, the reverse name for the <code class=\"docutils literal notranslate\"><span class=\"pre\">m2m</span></code> field would be\n<code class=\"docutils literal notranslate\"><span class=\"pre\">childa_set</span></code> in the <code class=\"docutils literal notranslate\"><span class=\"pre\">ChildA</span></code> case and <code class=\"docutils literal notranslate\"><span class=\"pre\">childb_set</span></code> for the <code class=\"docutils literal notranslate\"><span class=\"pre\">ChildB</span></code>\nfield.</p>\n</section>\n</section>\n<section id=\"multi-table-inheritance\">\n<span id=\"id8\"></span><h3>Multi-table inheritance<a class=\"heading-anchor\" href=\"#multi-table-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The second type of model inheritance supported by Django is when each model in\nthe hierarchy is a model all by itself. Each model corresponds to its own\ndatabase table and can be queried and created individually. The inheritance\nrelationship introduces links between the child model and each of its parents\n(via an automatically-created <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a>).\nFor example:</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Place</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\">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\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">address</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\">80</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Restaurant</span><span class=\"p\">(</span><span class=\"n\">Place</span><span class=\"p\">):</span>\n    <span class=\"n\">serves_hot_dogs</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">BooleanField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n    <span class=\"n\">serves_pizza</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">BooleanField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>All of the fields of <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> will also be available in <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code>,\nalthough the data will reside in a different database table. So these are both\npossible:</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Place</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Bob&#39;s Cafe&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Bob&#39;s Cafe&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>If you have a <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> that is also a <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code>, you can get from the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> object to the <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code> object by using the lower-case version\nof the model name:</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Place</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\">12</span><span class=\"p\">)</span>\n<span class=\"go\"># If p is a Restaurant object, this will give the child class:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">restaurant</span>\n<span class=\"go\">&lt;Restaurant: ...&gt;</span>\n</code></pre></div>\n<p>However, if <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code> in the above example was <em>not</em> a <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code> (it had been\ncreated directly as a <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> object or was the parent of some other class),\nreferring to <code class=\"docutils literal notranslate\"><span class=\"pre\">p.restaurant</span></code> would raise a <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant.DoesNotExist</span></code>\nexception.</p>\n<p>The automatically-created <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> on\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code> that links it to <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> looks like this:</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\">place_ptr</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">OneToOneField</span><span class=\"p\">(</span>\n    <span class=\"n\">Place</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\">parent_link</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>You can override that field by declaring your own\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> with <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField.parent_link\" title=\"django.db.models.OneToOneField.parent_link\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">parent_link=True</span></code></a> on <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code>.</p>\n<section id=\"meta-and-multi-table-inheritance\">\n<span id=\"id9\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> and multi-table inheritance<a class=\"heading-anchor\" href=\"#meta-and-multi-table-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>In the multi-table inheritance situation, it doesn't make sense for a child\nclass to inherit from its parent's <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> class. All the <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> options\nhave already been applied to the parent class and applying them again would\nnormally only lead to contradictory behavior (this is in contrast with the\nabstract base class case, where the base class doesn't exist in its own\nright).</p>\n<p>So a child model does not have access to its parent's <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> class. However, there are a few limited cases where the child\ninherits behavior from the parent: if the child does not specify an\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/options/#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> attribute or a\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/options/#django.db.models.Options.get_latest_by\" title=\"django.db.models.Options.get_latest_by\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">get_latest_by</span></code></a> attribute, it will inherit\nthese from its parent.</p>\n<p>If the parent has an ordering and you don't want the child to have any natural\nordering, you can explicitly disable it:</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\">ChildModel</span><span class=\"p\">(</span><span class=\"n\">ParentModel</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Remove parent&#39;s ordering effect</span>\n        <span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n</code></pre></div>\n</section>\n<section id=\"inheritance-and-reverse-relations\">\n<h4>Inheritance and reverse relations<a class=\"heading-anchor\" href=\"#inheritance-and-reverse-relations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Because multi-table inheritance uses an implicit\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> to link the child and\nthe parent, it's possible to move from the parent down to the child,\nas in the above example. However, this uses up the name that is the\ndefault <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a> value for\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> and\n<a class=\"reference internal\" href=\"/zh-hans/2.1/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> relations.  If you\nare putting those types of relations on a subclass of the parent model, you\n<strong>must</strong> specify the <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a>\nattribute on each such field. If you forget, Django will raise a validation\nerror.</p>\n<p>For example, using the above <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> class again, let's create another\nsubclass with a <a class=\"reference internal\" href=\"/zh-hans/2.1/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<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\">Supplier</span><span class=\"p\">(</span><span class=\"n\">Place</span><span class=\"p\">):</span>\n    <span class=\"n\">customers</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Place</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This results in the error:</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\">Reverse</span> <span class=\"n\">query</span> <span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"s1\">&#39;Supplier.customers&#39;</span> <span class=\"n\">clashes</span> <span class=\"k\">with</span> <span class=\"n\">reverse</span> <span class=\"n\">query</span>\n<span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"s1\">&#39;Supplier.place_ptr&#39;</span><span class=\"o\">.</span>\n\n<span class=\"n\">HINT</span><span class=\"p\">:</span> <span class=\"n\">Add</span> <span class=\"ow\">or</span> <span class=\"n\">change</span> <span class=\"n\">a</span> <span class=\"n\">related_name</span> <span class=\"n\">argument</span> <span class=\"n\">to</span> <span class=\"n\">the</span> <span class=\"n\">definition</span> <span class=\"k\">for</span>\n<span class=\"s1\">&#39;Supplier.customers&#39;</span> <span class=\"ow\">or</span> <span class=\"s1\">&#39;Supplier.place_ptr&#39;</span><span class=\"o\">.</span>\n</code></pre></div>\n<p>Adding <code class=\"docutils literal notranslate\"><span class=\"pre\">related_name</span></code> to the <code class=\"docutils literal notranslate\"><span class=\"pre\">customers</span></code> field as follows would resolve the\nerror: <code class=\"docutils literal notranslate\"><span class=\"pre\">models.ManyToManyField(Place,</span> <span class=\"pre\">related_name='provider')</span></code>.</p>\n</section>\n<section id=\"specifying-the-parent-link-field\">\n<h4>Specifying the parent link field<a class=\"heading-anchor\" href=\"#specifying-the-parent-link-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>As mentioned, Django will automatically create a\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> linking your child\nclass back to any non-abstract parent models. If you want to control the\nname of the attribute linking back to the parent, you can create your\nown <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> and set\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField.parent_link\" title=\"django.db.models.OneToOneField.parent_link\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">parent_link=True</span></code></a>\nto indicate that your field is the link back to the parent class.</p>\n</section>\n</section>\n<section id=\"proxy-models\">\n<span id=\"id10\"></span><h3>Proxy models<a class=\"heading-anchor\" href=\"#proxy-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When using <a class=\"reference internal\" href=\"#multi-table-inheritance\"><span class=\"std std-ref\">multi-table inheritance</span></a>, a new\ndatabase table is created for each subclass of a model. This is usually the\ndesired behavior, since the subclass needs a place to store any additional\ndata fields that are not present on the base class. Sometimes, however, you\nonly want to change the Python behavior of a model -- perhaps to change the\ndefault manager, or add a new method.</p>\n<p>This is what proxy model inheritance is for: creating a <em>proxy</em> for the\noriginal model. You can create, delete and update instances of the proxy model\nand all the data will be saved as if you were using the original (non-proxied)\nmodel. The difference is that you can change things like the default model\nordering or the default manager in the proxy, without having to alter the\noriginal.</p>\n<p>Proxy models are declared like normal models. You tell Django that it's a\nproxy model by setting the <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/options/#django.db.models.Options.proxy\" title=\"django.db.models.Options.proxy\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">proxy</span></code></a> attribute of\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> class to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<p>For example, suppose you want to add a method to the <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> model. You can do it like this:</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</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\">30</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\">30</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyPerson</span><span class=\"p\">(</span><span class=\"n\">Person</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">proxy</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">do_something</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"k\">pass</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">MyPerson</span></code> class operates on the same database table as its parent\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> class. In particular, any new instances of <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> will also be\naccessible through <code class=\"docutils literal notranslate\"><span class=\"pre\">MyPerson</span></code>, and vice-versa:</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;foobar&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">MyPerson</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=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;foobar&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;MyPerson: foobar&gt;</span>\n</code></pre></div>\n<p>你仍然可以使用一个代理模型来定义模型的默认排序方法。你也许不会想一直对“Persion”进行排序，但是通常情况下用代理模型根据“last_name”属性进行排序。这很简单:</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\">OrderedPerson</span><span class=\"p\">(</span><span class=\"n\">Person</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">]</span>\n        <span class=\"n\">proxy</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>Now normal <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> queries will be unordered\nand <code class=\"docutils literal notranslate\"><span class=\"pre\">OrderedPerson</span></code> queries will be ordered by <code class=\"docutils literal notranslate\"><span class=\"pre\">last_name</span></code>.</p>\n<p>代理模型继承“Meta”属性:ref:和普通模型使用同样的方法&lt;meta-and-multi-table-inheritance&gt;。</p>\n<section id=\"querysets-still-return-the-model-that-was-requested\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>s still return the model that was requested<a class=\"heading-anchor\" href=\"#querysets-still-return-the-model-that-was-requested\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>There is no way to have Django return, say, a <code class=\"docutils literal notranslate\"><span class=\"pre\">MyPerson</span></code> object whenever you\nquery for <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> objects. A queryset for <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> objects will return\nthose types of objects. The whole point of proxy objects is that code relying\non the original <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> will use those and your own code can use the\nextensions you included (that no other code is relying on anyway). It is not\na way to replace the <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> (or any other) model everywhere with something\nof your own creation.</p>\n</section>\n<section id=\"base-class-restrictions\">\n<h4>Base class restrictions<a class=\"heading-anchor\" href=\"#base-class-restrictions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>一个代理模型必须仅能继承一个非抽象模型类。你不能继承多个非抽象模型类，因为代理模型无法提供不同数据表的任何行间连接。一个代理模型可以继承任意数量的抽象模型类，假如他们*没有*定义任何的模型字段。一个代理模型也可以继承任意数量的代理模型，只需他们共享同一个非抽象父类。</p>\n</section>\n<section id=\"proxy-model-managers\">\n<h4>代理模型管理器<a class=\"heading-anchor\" href=\"#proxy-model-managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>If you don't specify any model managers on a proxy model, it inherits the\nmanagers from its model parents. If you define a manager on the proxy model,\nit will become the default, although any managers defined on the parent\nclasses will still be available.</p>\n<p>Continuing our example from above, you could change the default manager used\nwhen you query the <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> model like this:</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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">NewManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyPerson</span><span class=\"p\">(</span><span class=\"n\">Person</span><span class=\"p\">):</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">NewManager</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\">proxy</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>If you wanted to add a new manager to the Proxy, without replacing the\nexisting default, you can use the techniques described in the <a class=\"reference internal\" href=\"/zh-hans/2.1/topics/db/managers/#custom-managers-and-inheritance\"><span class=\"std std-ref\">custom\nmanager</span></a> documentation: create a base class\ncontaining the new managers and inherit that after the primary base class:</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\"># Create an abstract class for the new manager.</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ExtraManagers</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\">secondary</span> <span class=\"o\">=</span> <span class=\"n\">NewManager</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\">abstract</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyPerson</span><span class=\"p\">(</span><span class=\"n\">Person</span><span class=\"p\">,</span> <span class=\"n\">ExtraManagers</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">proxy</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>通常情况下，你可能不需要这么做。然而，你需要的时候，这也是可以的。</p>\n</section>\n<section id=\"differences-between-proxy-inheritance-and-unmanaged-models\">\n<span id=\"proxy-vs-unmanaged-models\"></span><h4>Differences between proxy inheritance and unmanaged models<a class=\"heading-anchor\" href=\"#differences-between-proxy-inheritance-and-unmanaged-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Proxy model inheritance might look fairly similar to creating an unmanaged\nmodel, using the <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/options/#django.db.models.Options.managed\" title=\"django.db.models.Options.managed\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">managed</span></code></a> attribute on a\nmodel's <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> class.</p>\n<p>With careful setting of <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/options/#django.db.models.Options.db_table\" title=\"django.db.models.Options.db_table\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.db_table</span></code></a> you could create an unmanaged model that\nshadows an existing model and adds Python methods to it. However, that would be\nvery repetitive and fragile as you need to keep both copies synchronized if you\nmake any changes.</p>\n<p>On the other hand, proxy models are intended to behave exactly like the model\nthey are proxying for. They are always in sync with the parent model since they\ndirectly inherit its fields and managers.</p>\n<p>The general rules are:</p>\n<ol class=\"arabic simple\">\n<li><p>If you are mirroring an existing model or database table and don't want\nall the original database table columns, use <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.managed=False</span></code>.\nThat option is normally useful for modeling database views and tables\nnot under the control of Django.</p></li>\n<li><p>If you are wanting to change the Python-only behavior of a model, but\nkeep all the same fields as in the original, use <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.proxy=True</span></code>.\nThis sets things up so that the proxy model is an exact copy of the\nstorage structure of the original model when data is saved.</p></li>\n</ol>\n</section>\n</section>\n<section id=\"multiple-inheritance\">\n<span id=\"model-multiple-inheritance-topic\"></span><h3>Multiple inheritance<a class=\"heading-anchor\" href=\"#multiple-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Just as with Python's subclassing, it's possible for a Django model to inherit\nfrom multiple parent models. Keep in mind that normal Python name resolution\nrules apply. The first base class that a particular name (e.g. <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a>) appears in will be the one that is used; for example, this\nmeans that if multiple parents contain a <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> class,\nonly the first one is going to be used, and all others will be ignored.</p>\n<p>Generally, you won't need to inherit from multiple parents. The main use-case\nwhere this is useful is for &quot;mix-in&quot; classes: adding a particular extra\nfield or method to every class that inherits the mix-in. Try to keep your\ninheritance hierarchies as simple and straightforward as possible so that you\nwon't have to struggle to work out where a particular piece of information is\ncoming from.</p>\n<p>Note that inheriting from multiple models that have a common <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> primary\nkey field will raise an error. To properly use multiple inheritance, you can\nuse an explicit <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a> in the base models:</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\">Article</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\">article_id</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">AutoField</span><span class=\"p\">(</span><span class=\"n\">primary_key</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</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\">book_id</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">AutoField</span><span class=\"p\">(</span><span class=\"n\">primary_key</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookReview</span><span class=\"p\">(</span><span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">Article</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Or use a common ancestor to hold the <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a>. This\nrequires using an explicit <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> from each\nparent model to the common ancestor to avoid a clash between the fields that\nare automatically generated and inherited by the child:</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\">Piece</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=\"k\">pass</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">Piece</span><span class=\"p\">):</span>\n    <span class=\"n\">article_piece</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">OneToOneField</span><span class=\"p\">(</span><span class=\"n\">Piece</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> <span class=\"n\">parent_link</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">Piece</span><span class=\"p\">):</span>\n    <span class=\"n\">book_piece</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">OneToOneField</span><span class=\"p\">(</span><span class=\"n\">Piece</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> <span class=\"n\">parent_link</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookReview</span><span class=\"p\">(</span><span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">Article</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n</section>\n<section id=\"field-name-hiding-is-not-permitted\">\n<h3>Field name &quot;hiding&quot; is not permitted<a class=\"heading-anchor\" href=\"#field-name-hiding-is-not-permitted\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>In normal Python class inheritance, it is permissible for a child class to\noverride any attribute from the parent class. In Django, this isn't usually\npermitted for model fields. If a non-abstract model base class has a field\ncalled <code class=\"docutils literal notranslate\"><span class=\"pre\">author</span></code>, you can't create another model field or define\nan attribute called <code class=\"docutils literal notranslate\"><span class=\"pre\">author</span></code> in any class that inherits from that base class.</p>\n<p>This restriction doesn't apply to model fields inherited from an abstract\nmodel. Such fields may be overridden with another field or value, or be removed\nby setting <code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span> <span class=\"pre\">=</span> <span class=\"pre\">None</span></code>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>Model managers are inherited from abstract base classes. Overriding an\ninherited field which is referenced by an inherited\n<a class=\"reference internal\" href=\"/zh-hans/2.1/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> may cause subtle bugs. See <a class=\"reference internal\" href=\"/zh-hans/2.1/topics/db/managers/#custom-managers-and-inheritance\"><span class=\"std std-ref\">custom\nmanagers and model inheritance</span></a>.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Some fields define extra attributes on the model, e.g. a\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> defines an extra attribute with\n<code class=\"docutils literal notranslate\"><span class=\"pre\">_id</span></code> appended to the field name, as well as <code class=\"docutils literal notranslate\"><span class=\"pre\">related_name</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">related_query_name</span></code> on the foreign model.</p>\n<p>These extra attributes cannot be overridden unless the field that defines\nit is changed or removed so that it no longer defines the extra attribute.</p>\n</aside>\n<p>Overriding fields in a parent model leads to difficulties in areas such as\ninitializing new instances (specifying which field is being initialized in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Model.__init__</span></code>) and serialization. These are features which normal Python\nclass inheritance doesn't have to deal with in quite the same way, so the\ndifference between Django model inheritance and Python class inheritance isn't\narbitrary.</p>\n<p>This restriction only applies to attributes which are\n<a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> instances. Normal Python attributes\ncan be overridden if you wish. It also only applies to the name of the\nattribute as Python sees it: if you are manually specifying the database\ncolumn name, you can have the same column name appearing in both a child and\nan ancestor model for multi-table inheritance (they are columns in two\ndifferent database tables).</p>\n<p>Django will raise a <a class=\"reference internal\" href=\"/zh-hans/2.1/ref/exceptions/#django.core.exceptions.FieldError\" title=\"django.core.exceptions.FieldError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">FieldError</span></code></a> if you override\nany model field in any ancestor model.</p>\n</section>\n</section>\n<section id=\"organizing-models-in-a-package\">\n<h2>Organizing models in a package<a class=\"heading-anchor\" href=\"#organizing-models-in-a-package\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The <a class=\"reference internal\" href=\"/zh-hans/2.1/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> command creates an application\nstructure that includes a <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> file. If you have many models,\norganizing them in separate files may be useful.</p>\n<p>To do so, create a <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code> package. Remove <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> and create a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">myapp/models/</span></code> directory with an <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code> file and the files to\nstore your models. You must import the models in the <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code> file.</p>\n<p>For example, if you had <code class=\"docutils literal notranslate\"><span class=\"pre\">organic.py</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">synthetic.py</span></code> in the <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code>\ndirectory:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">myapp/models/__init__.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.organic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Person</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.synthetic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Robot</span>\n</code></pre></figure>\n<p>Explicitly importing each model rather than using <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">.models</span> <span class=\"pre\">import</span> <span class=\"pre\">*</span></code>\nhas the advantages of not cluttering the namespace, making code more readable,\nand keeping code analysis tools useful.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<dl class=\"simple\">\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.1/ref/models/\"><span class=\"doc\">The Models Reference</span></a></dt><dd><p>Covers all the model related APIs including model fields, related\nobjects, and <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n</dd>\n</dl>\n</aside>\n</section>","rootId":"module-django.db.models","toc":[{"title":"快速上手","anchor":"quick-example","children":[]},{"title":"使用模型","anchor":"using-models","children":[]},{"title":"字段","anchor":"fields","children":[{"title":"字段类型","anchor":"field-types","children":[]},{"title":"字段选项","anchor":"field-options","children":[]},{"title":"自动设置主键","anchor":"automatic-primary-key-fields","children":[]},{"title":"备注名","anchor":"verbose-field-names","children":[]},{"title":"关联关系","anchor":"relationships","children":[{"title":"Many-to-one relationships","anchor":"many-to-one-relationships","children":[]},{"title":"Many-to-many relationships","anchor":"many-to-many-relationships","children":[]},{"title":"在多对多(many-to-many)关系中添加添加额外的属性字段","anchor":"extra-fields-on-many-to-many-relationships","children":[]},{"title":"One-to-one relationships","anchor":"one-to-one-relationships","children":[]}]},{"title":"跨文件模型","anchor":"models-across-files","children":[]},{"title":"字段命名限制","anchor":"field-name-restrictions","children":[]},{"title":"自定义的字段类型","anchor":"custom-field-types","children":[]}]},{"title":"Meta 选项","anchor":"meta-options","children":[]},{"title":"模型属性","anchor":"model-attributes","children":[]},{"title":"模型方法","anchor":"model-methods","children":[{"title":"Overriding predefined model methods","anchor":"overriding-predefined-model-methods","children":[]},{"title":"Executing custom SQL","anchor":"executing-custom-sql","children":[]}]},{"title":"模型继承","anchor":"model-inheritance","children":[{"title":"Abstract base classes","anchor":"abstract-base-classes","children":[{"title":"Meta inheritance","anchor":"meta-inheritance","children":[]},{"title":"Be careful with related_name and related_query_name","anchor":"be-careful-with-related-name-and-related-query-name","children":[]}]},{"title":"Multi-table inheritance","anchor":"multi-table-inheritance","children":[{"title":"Meta and multi-table inheritance","anchor":"meta-and-multi-table-inheritance","children":[]},{"title":"Inheritance and reverse relations","anchor":"inheritance-and-reverse-relations","children":[]},{"title":"Specifying the parent link field","anchor":"specifying-the-parent-link-field","children":[]}]},{"title":"Proxy models","anchor":"proxy-models","children":[{"title":"QuerySets still return the model that was requested","anchor":"querysets-still-return-the-model-that-was-requested","children":[]},{"title":"Base class restrictions","anchor":"base-class-restrictions","children":[]},{"title":"代理模型管理器","anchor":"proxy-model-managers","children":[]},{"title":"Differences between proxy inheritance and unmanaged models","anchor":"differences-between-proxy-inheritance-and-unmanaged-models","children":[]}]},{"title":"Multiple inheritance","anchor":"multiple-inheritance","children":[]},{"title":"Field name \"hiding\" is not permitted","anchor":"field-name-hiding-is-not-permitted","children":[]}]},{"title":"Organizing models in a package","anchor":"organizing-models-in-a-package","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Using Django","url":"/zh-hans/2.1/topics/"},{"docname":"topics/db/index","title":"模型和数据库","url":"/zh-hans/2.1/topics/db/"}],"prev":{"docname":"topics/db/index","title":"模型和数据库","url":"/zh-hans/2.1/topics/db/"},"next":{"docname":"topics/db/queries","title":"进行查询","url":"/zh-hans/2.1/topics/db/queries/"},"formats":{"html":"/zh-hans/2.1/topics/db/models/","markdown":"/zh-hans/2.1/topics/db/models.md","json":"/zh-hans/2.1/topics/db/models.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/topics/db/models.txt","official":"https://docs.djangoproject.com/zh-hans/2.1/topics/db/models/","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","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}