{"title":"モデル","version":"2.0","locale":"ja","docname":"topics/db/models","url":"/ja/2.0/topics/db/models/","canonical":"https://djangodocs.dev/ja/2.0/topics/db/models/","summary":"モデルは、データに関する単一の決定的な情報源です。これはあなたが保持するデータが必要とするフィールドと振る舞いについての情報を持ちます。一般的に、各モデルは単一のデータベースのテーブルに対応付けられます。 基本: モデルは各々 Python のクラスであり django.db.models.Model のサブクラスです。…","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=\"/ja/2.0/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=\"/ja/2.0/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\">first_name</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">last_name</span></code> を持つ <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</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><code class=\"docutils literal notranslate\"><span class=\"pre\">myapp_person</span></code> というテーブル名は、いくつかのモデルのメタデータから自動的に生成されますがそれを無効化する事ができます。詳細は <a class=\"reference internal\" href=\"/ja/2.0/ref/models/options/#table-names\"><span class=\"std std-ref\">Table names</span></a> を参照ください。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> フィールドは自動的に追加されますが、この処理を無効化する事ができます。<a class=\"reference internal\" href=\"#automatic-primary-key-fields\"><span class=\"std std-ref\">自動インクリメントのプライマリーキーフィールド</span></a> を参照ください。</p></li>\n<li><p>この例における <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code> の SQL は PostgreSQL の文法に準拠していますが、Django は <a class=\"reference internal\" href=\"/ja/2.0/topics/settings/\"><span class=\"doc\">設定ファイル</span></a> 内に定義されたデータベースバックエンドに合わせた SQL を適切に生成してくれるということを覚えておくとよいでしょう。</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 にこれらのモデルを <em>利用する</em> 事を知らせる必要が有ります。それは設定ファイルを編集して設定値 <a class=\"reference internal\" href=\"/ja/2.0/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>たとえば、アプリケーションのモデルが <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp.models</span></code> モジュール内に存在する場合 (このパッケージ構造は <a class=\"reference internal\" href=\"/ja/2.0/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> スクリプトによってアプリケーション内に構築されるものです)、<a class=\"reference internal\" href=\"/ja/2.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> の部分を次のように定義します。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">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=\"/ja/2.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> 内に新たなアプリケーションを追加した場合、<a class=\"reference internal\" href=\"/ja/2.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code></a> を、初回は必要に応じて <a class=\"reference internal\" href=\"/ja/2.0/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>モデルにおいて最も重要な箇所であり -- モデルにおいて唯一必須となっている箇所 -- それはそのモデルが定義するデータベースのフィールドの一覧になります。フィールドはクラスの属性として定義されます。フィールド名として <code class=\"docutils literal notranslate\"><span class=\"pre\">clean</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">save</span></code> あるいは <code class=\"docutils literal notranslate\"><span class=\"pre\">delete</span></code> のような <a class=\"reference internal\" href=\"/ja/2.0/ref/models/instances/\"><span class=\"doc\">models API</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\">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>モデル内の各フィールドは適切に <a class=\"reference internal\" href=\"/ja/2.0/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> クラスのインスタンスとなっている必要が有ります。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 <a class=\"reference internal\" href=\"/ja/2.0/ref/forms/widgets/\"><span class=\"doc\">ウィジェット</span></a> (例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;text&quot;&gt;</span></code>、 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;select&gt;</span></code>)。</p></li>\n<li><p>最低限必要とされる入力値確認、Django の管理機能と自動生成されるフォームにおいて利用されます。</p></li>\n</ul>\n<p>Django は多くのフィールド型を内蔵しています; それらの完全な一覧は <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#model-field-types\"><span class=\"std std-ref\">フィールドの型</span></a> で確認できます。もし Django に内蔵されたフィールドの型では実現できない機能を実装したい場合は独自のフィールドを簡単に記述できます; <a class=\"reference internal\" href=\"/ja/2.0/howto/custom-model-fields/\"><span class=\"doc\">Writing custom model fields</span></a> を参照してください。</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>フィールドはそれぞれあらかじめ定められたフィールド特有の引数 ( <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#model-field-types\"><span class=\"std std-ref\">モデルのフィールド型一覧</span></a> にまとめられています) を受け取ります。例えば、<a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> (およびそのサブクラス) はそのデータを保持するためにデータベース上に定義される <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> 領域の長さを定義する引数 <a class=\"reference internal\" href=\"/ja/2.0/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> を必要とします。</p>\n<p>全てのフィールドの型で利用できる共通の引数も存在します。すべてオプションの引数です。これらの引数についてはこちらの <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#common-model-field-options\"><span class=\"std std-ref\">リファレンス</span></a> 内で全て説明されていますが、ここでは、特に頻繁に使われるものについて簡単な概要を説明します。</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/ja/2.0/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=\"/ja/2.0/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><a class=\"reference internal\" href=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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>フィールドの選択肢として用いられる 2 値のタプルのイテラブルなオブジェクト (例えばリストやタプル) です。このオプションが渡された場合、デフォルトのフォームウィジェットが標準のテキストフィールドからセレクトボックスに変わり与えられた選択肢のみに選択を制限します。</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>各タプルの1番目の要素はデータベースに保存される値です。2番目の要素はフォームウィジェットに表示される名前です。</p>\n<p>モデルのインスタンスが与えられたとき、<code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code> のフィールドに対して表示される値は、<a class=\"reference internal\" href=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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>フォームウィジェットとともに表示される追加の「ヘルプ」テキストです。この値はフィールドがフォームとして利用されない場合でもドキュメントとして役に立ちます。</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a> を追加します、つまりその主キーに対するデフォルトの動作を変更する必要がない場合はどのフィールドに対しても <a class=\"reference internal\" href=\"/ja/2.0/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> を設定する必要が有りません。</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=\"/ja/2.0/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>繰り返しになりますが、これらは特によく利用されるフィールドのオプションの概説です。完全な説明は <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#common-model-field-options\"><span class=\"std std-ref\">共通のフィールドオプションの説明</span></a> で参照できます。</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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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> が必ず 1 つだけ (明示的に宣言されるか、自動的に追加されるかのどちらかで) 存在する必要があります。</p>\n</section>\n<section id=\"verbose-field-names\">\n<span id=\"id2\"></span><h3>冗長な (verbose) フィールド名<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>Each field type, except for <a class=\"reference internal\" href=\"/ja/2.0/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>,\n<a class=\"reference internal\" href=\"/ja/2.0/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\n<a class=\"reference internal\" href=\"/ja/2.0/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>, takes an optional first positional\nargument -- a verbose name. If the verbose name isn't given, Django will\nautomatically create it using the field's attribute name, converting underscores\nto spaces.</p>\n<p>In this example, the verbose name is <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>In this example, the verbose name is <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=\"/ja/2.0/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>,\n<a class=\"reference internal\" href=\"/ja/2.0/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\n<a class=\"reference internal\" href=\"/ja/2.0/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> require the first argument to be a\nmodel class, so use the <a class=\"reference internal\" href=\"/ja/2.0/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> keyword argument:</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>The convention is not to capitalize the first letter of the\n<a class=\"reference internal\" href=\"/ja/2.0/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 will automatically capitalize the first\nletter where it needs to.</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>Clearly, the power of relational databases lies in relating tables to each\nother. Django offers ways to define the three most common types of database\nrelationships: many-to-one, many-to-many and one-to-one.</p>\n<section id=\"many-to-one-relationships\">\n<h4>多対一 (many-to-one) 関係<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>To define a many-to-one relationship, use <a class=\"reference internal\" href=\"/ja/2.0/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>.\nYou use it just like any other <a class=\"reference internal\" href=\"/ja/2.0/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> type: by\nincluding it as a class attribute of your model.</p>\n<p><a class=\"reference internal\" href=\"/ja/2.0/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>For example, if a <code class=\"docutils literal notranslate\"><span class=\"pre\">Car</span></code> model has a <code class=\"docutils literal notranslate\"><span class=\"pre\">Manufacturer</span></code> -- that is, a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Manufacturer</span></code> makes multiple cars but each <code class=\"docutils literal notranslate\"><span class=\"pre\">Car</span></code> only has one\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Manufacturer</span></code> -- use the following definitions:</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>You can also create <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#recursive-relationships\"><span class=\"std std-ref\">recursive relationships</span></a> (an\nobject with a many-to-one relationship to itself) and <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#lazy-relationships\"><span class=\"std std-ref\">relationships to\nmodels not yet defined</span></a>; see <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#ref-foreignkey\"><span class=\"std std-ref\">the model field\nreference</span></a> for details.</p>\n<p>It's suggested, but not required, that the name of a\n<a class=\"reference internal\" href=\"/ja/2.0/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> field (<code class=\"docutils literal notranslate\"><span class=\"pre\">manufacturer</span></code> in the example\nabove) be the name of the model, lowercase. You can, of course, call the field\nwhatever you want. 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=\"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\">参考</p>\n<p><a class=\"reference internal\" href=\"/ja/2.0/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> fields accept a number of extra\narguments which are explained in <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#foreign-key-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<p>For details on accessing backwards-related objects, see the\n<a class=\"reference internal\" href=\"/ja/2.0/topics/db/queries/#backwards-related-objects\"><span class=\"std std-ref\">Following relationships backward example</span></a>.</p>\n<p>For sample code, see the <a class=\"reference internal\" href=\"/ja/2.0/topics/db/examples/many_to_one/\"><span class=\"doc\">Many-to-one relationship model example</span></a>.</p>\n</aside>\n</section>\n<section id=\"many-to-many-relationships\">\n<h4>多対多 (many-to-many) 関係<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>To define a many-to-many relationship, use\n<a class=\"reference internal\" href=\"/ja/2.0/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>. You use it just like any other\n<a class=\"reference internal\" href=\"/ja/2.0/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> type: by including it as a class attribute of\nyour model.</p>\n<p><a class=\"reference internal\" href=\"/ja/2.0/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>For example, if a <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> has multiple <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span></code> objects -- that is, a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span></code> can be on multiple pizzas and each <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> has multiple toppings\n-- here's how you'd represent that:</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>As with <a class=\"reference internal\" href=\"/ja/2.0/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>, you can also create\n<a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#recursive-relationships\"><span class=\"std std-ref\">recursive relationships</span></a> (an object with a\nmany-to-many relationship to itself) and <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#lazy-relationships\"><span class=\"std std-ref\">relationships to models not yet\ndefined</span></a>.</p>\n<p>It's suggested, but not required, that the name of a\n<a class=\"reference internal\" href=\"/ja/2.0/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> in the example above)\nbe a plural describing the set of related model objects.</p>\n<p>It doesn't matter which model has the\n<a class=\"reference internal\" href=\"/ja/2.0/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>, but you should only put it in one\nof the models -- not both.</p>\n<p>Generally, <a class=\"reference internal\" href=\"/ja/2.0/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> instances should go in\nthe object that's going to be edited on a form. In the above example,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">toppings</span></code> is in <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> (rather than <code class=\"docutils literal notranslate\"><span class=\"pre\">Topping</span></code> having a <code class=\"docutils literal notranslate\"><span class=\"pre\">pizzas</span></code>\n<a class=\"reference internal\" href=\"/ja/2.0/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> ) because it's more natural to think\nabout a pizza having toppings than a topping being on multiple pizzas. The way\nit's set up above, the <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> form would let users select the toppings.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">参考</p>\n<p>See the <a class=\"reference internal\" href=\"/ja/2.0/topics/db/examples/many_to_many/\"><span class=\"doc\">Many-to-many relationship model example</span></a> for a full example.</p>\n</aside>\n<p><a class=\"reference internal\" href=\"/ja/2.0/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=\"/ja/2.0/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>多対多リレーションにおける追加フィールド<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>When you're only dealing with simple many-to-many relationships such as\nmixing and matching pizzas and toppings, a standard\n<a class=\"reference internal\" href=\"/ja/2.0/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> is all you need. However, sometimes\nyou may need to associate data with the relationship between two models.</p>\n<p>For example, consider the case of an application tracking the musical groups\nwhich musicians belong to. There is a many-to-many relationship between a person\nand the groups of which they are a member, so you could use a\n<a class=\"reference internal\" href=\"/ja/2.0/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> to represent this relationship.\nHowever, there is a lot of detail about the membership that you might want to\ncollect, such as the date at which the person joined the group.</p>\n<p>For these situations, Django allows you to specify the model that will be used\nto govern the many-to-many relationship. You can then put extra fields on the\nintermediate model. The intermediate model is associated with the\n<a class=\"reference internal\" href=\"/ja/2.0/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> using the\n<a class=\"reference internal\" href=\"/ja/2.0/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> argument to point to the model\nthat will act as an intermediary. For our musician example, the code would look\nsomething 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\">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>When you set up the intermediary model, you explicitly specify foreign\nkeys to the models that are involved in the many-to-many relationship. This\nexplicit declaration defines how the two models are related.</p>\n<p>中間モデルにはいくつかの制約があります。</p>\n<ul class=\"simple\">\n<li><p>Your intermediate model must contain one - and <em>only</em> one - foreign key\nto the source model (this would be <code class=\"docutils literal notranslate\"><span class=\"pre\">Group</span></code> in our example), or you must\nexplicitly specify the foreign keys Django should use for the relationship\nusing <a class=\"reference internal\" href=\"/ja/2.0/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>.\nIf you have more than one foreign key and <code class=\"docutils literal notranslate\"><span class=\"pre\">through_fields</span></code> is not\nspecified, a validation error will be raised. A similar restriction applies\nto the foreign key to the target model (this would be <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> in our\nexample).</p></li>\n<li><p>For a model which has a many-to-many relationship to itself through an\nintermediary model, two foreign keys to the same model are permitted, but\nthey will be treated as the two (different) sides of the many-to-many\nrelationship. If there are <em>more</em> than two foreign keys though, you\nmust also specify <code class=\"docutils literal notranslate\"><span class=\"pre\">through_fields</span></code> as above, or a validation error\nwill be raised.</p></li>\n<li><p>When defining a many-to-many relationship from a model to\nitself, using an intermediary model, you <em>must</em> use\n<a class=\"reference internal\" href=\"/ja/2.0/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> (see\n<a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#manytomany-arguments\"><span class=\"std std-ref\">the model field reference</span></a>).</p></li>\n</ul>\n<p>Now that you have set up your <a class=\"reference internal\" href=\"/ja/2.0/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> to use\nyour intermediary model (<code class=\"docutils literal notranslate\"><span class=\"pre\">Membership</span></code>, in this case), you're ready to start\ncreating some many-to-many relationships. You do this by creating instances of\nthe intermediate model:</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>Unlike normal many-to-many fields, you <em>can't</em> use <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code>,\nor <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> to create relationships:</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>Why? You can't just create a relationship between a <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> and a <code class=\"docutils literal notranslate\"><span class=\"pre\">Group</span></code>\n- you need to specify all the detail for the relationship required by the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Membership</span></code> model. The simple <code class=\"docutils literal notranslate\"><span class=\"pre\">add</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">create</span></code> and assignment calls\ndon't provide a way to specify this extra detail. As a result, they are\ndisabled for many-to-many relationships that use an intermediate model.\nThe only way to create this type of relationship is to create instances of the\nintermediate model.</p>\n<p>The <a class=\"reference internal\" href=\"/ja/2.0/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> method is\ndisabled for similar reasons. For example, if the custom through table defined\nby the intermediate model does not enforce uniqueness on the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">(model1,</span> <span class=\"pre\">model2)</span></code> pair, a <code class=\"docutils literal notranslate\"><span class=\"pre\">remove()</span></code> call would not provide enough\ninformation as to which intermediate model instance should be deleted:</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>However, the <a class=\"reference internal\" href=\"/ja/2.0/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>\nmethod can be used to remove all many-to-many relationships for an instance:</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>Once you have established the many-to-many relationships by creating instances\nof your intermediate model, you can issue queries. Just as with normal\nmany-to-many relationships, you can query using the attributes of the\nmany-to-many-related model:</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>As you are using an intermediate model, you can also query on its attributes:</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>If you need to access a membership's information you may do so by directly\nquerying the <code class=\"docutils literal notranslate\"><span class=\"pre\">Membership</span></code> model:</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>Another way to access the same information is by querying the\n<a class=\"reference internal\" href=\"/ja/2.0/topics/db/queries/#m2m-reverse-relationships\"><span class=\"std std-ref\">many-to-many reverse relationship</span></a> from a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> object:</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) 関係<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>To define a one-to-one relationship, use\n<a class=\"reference internal\" href=\"/ja/2.0/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>. You use it just like any other\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> type: by including it as a class attribute of your model.</p>\n<p>This is most useful on the primary key of an object when that object &quot;extends&quot;\nanother object in some way.</p>\n<p><a class=\"reference internal\" href=\"/ja/2.0/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> requires a positional argument: the\nclass to which the model is related.</p>\n<p>For example, if you were building a database of &quot;places&quot;, you would\nbuild pretty standard stuff such as address, phone number, etc. in the\ndatabase. Then, if you wanted to build a database of restaurants on\ntop of the places, instead of repeating yourself and replicating those\nfields in the <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code> model, you could make <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code> have\na <a class=\"reference internal\" href=\"/ja/2.0/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 <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> (because a\nrestaurant &quot;is a&quot; place; in fact, to handle this you'd typically use\n<a class=\"reference internal\" href=\"#model-inheritance\"><span class=\"std std-ref\">inheritance</span></a>, which involves an implicit\none-to-one relation).</p>\n<p>As with <a class=\"reference internal\" href=\"/ja/2.0/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 <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#recursive-relationships\"><span class=\"std std-ref\">recursive relationship</span></a> can be defined and <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#lazy-relationships\"><span class=\"std std-ref\">references to as-yet\nundefined models</span></a> can be made.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">参考</p>\n<p>See the <a class=\"reference internal\" href=\"/ja/2.0/topics/db/examples/one_to_one/\"><span class=\"doc\">One-to-one relationship model example</span></a> for a full example.</p>\n</aside>\n<p><a class=\"reference internal\" href=\"/ja/2.0/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> fields also accept an optional\n<a class=\"reference internal\" href=\"/ja/2.0/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> argument.</p>\n<p><a class=\"reference internal\" href=\"/ja/2.0/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> classes used to automatically become\nthe primary key on a model. This is no longer true (although you can manually\npass in the <a class=\"reference internal\" href=\"/ja/2.0/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> argument if you like).\nThus, it's now possible to have multiple fields of type\n<a class=\"reference internal\" href=\"/ja/2.0/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 a single model.</p>\n</section>\n</section>\n<section id=\"models-across-files\">\n<h3>Models across files<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 がフィールド名に課している制約は、次のたった2つです。</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>フィールド名に2文字以上連続するアンダースコアを使用できない。これは、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=\"/ja/2.0/ref/models/fields/#django.db.models.Field.db_column\" title=\"django.db.models.Field.db_column\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_column</span></code></a> オプションをご覧ください。</p>\n<p>SQL reserved words, such as <code class=\"docutils literal notranslate\"><span class=\"pre\">join</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code>, <em>are</em> allowed as\nmodel field names, because Django escapes all database table names and column\nnames in every underlying SQL query. It uses the quoting syntax of your\nparticular database engine.</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>If one of the existing model fields cannot be used to fit your purposes, or if\nyou wish to take advantage of some less common database column types, you can\ncreate your own field class. Full coverage of creating your own fields is\nprovided in <a class=\"reference internal\" href=\"/ja/2.0/howto/custom-model-fields/\"><span class=\"doc\">Writing custom model fields</span></a>.</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>Give your model metadata by using an inner <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Meta</span></code>, like so:</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>Model metadata is &quot;anything that's not a field&quot;, such as ordering options\n(<a class=\"reference internal\" href=\"/ja/2.0/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>), database table name (<a class=\"reference internal\" href=\"/ja/2.0/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>), or\nhuman-readable singular and plural names (<a class=\"reference internal\" href=\"/ja/2.0/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> and\n<a class=\"reference internal\" href=\"/ja/2.0/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>). None are required, and adding <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span>\n<span class=\"pre\">Meta</span></code> to a model is completely optional.</p>\n<p>A complete list of all possible <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> options can be found in the <a class=\"reference internal\" href=\"/ja/2.0/ref/models/options/\"><span class=\"doc\">model\noption reference</span></a>.</p>\n</section>\n<section id=\"model-attributes\">\n<span id=\"id4\"></span><h2>Model attributes<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>The most important attribute of a model is the\n<a class=\"reference internal\" href=\"/ja/2.0/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>. It's the interface through which\ndatabase query operations are provided to Django models and is used to\n<a class=\"reference internal\" href=\"/ja/2.0/topics/db/queries/#retrieving-objects\"><span class=\"std std-ref\">retrieve the instances</span></a> from the database. If no\ncustom <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> is defined, the default name is\n<a class=\"reference internal\" href=\"/ja/2.0/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>. Managers are only accessible via\nmodel classes, not the model instances.</p>\n</dd>\n</dl>\n</section>\n<section id=\"model-methods\">\n<span id=\"id5\"></span><h2>Model methods<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=\"/ja/2.0/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=\"/ja/2.0/glossary/#term-property\"><span class=\"xref std std-term\">property</span></a>.</p>\n<p>The <a class=\"reference internal\" href=\"/ja/2.0/ref/models/instances/\"><span class=\"doc\">model instance reference</span></a> has a complete list\nof <a class=\"reference internal\" href=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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>下すべき決定事項は親モデルを (保持するデータベースのテーブルと共に) 独自の権限を持ったモデルとするか、それとも親モデルは単に子モデルを通じてのみ参照できる共通情報を持っているだけの存在とするかという事だけです。</p>\n<p>Django において可能な継承には 3 つの方式が有ります。</p>\n<ol class=\"arabic simple\">\n<li><p>往々にして、子モデルそれぞれに対して一々定義し直さないで済ませたい情報を保持するためだけに親クラスを用いようとするでしょう。そのクラスは単体で用いられることはありません、<a class=\"reference internal\" href=\"#abstract-base-classes\"><span class=\"std std-ref\">抽象基底クラス</span></a> こそあなたが必要とする物でしょう。</p></li>\n<li><p>もし既存のモデル (完全に別のアプリケーション等から取得した) のサブクラスを作成していてモデルそれぞれにデータベース上のテーブルを定義したい場合、 <a class=\"reference internal\" href=\"#multi-table-inheritance\"><span class=\"std std-ref\">複数テーブルの継承</span></a> を利用するとよいでしょう。</p></li>\n<li><p>最後に、もしあるモデルの Python レベルでの振る舞いを、そのモデルのフィールドをいかなる形でも変更せずに修正したい場合は <a class=\"reference internal\" href=\"#proxy-models\"><span class=\"std std-ref\">プロキシモデル</span></a> を利用できます。</p></li>\n</ol>\n<section id=\"abstract-base-classes\">\n<span id=\"id7\"></span><h3>抽象基底クラス<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>実装例:</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><code class=\"docutils literal notranslate\"><span class=\"pre\">Student</span></code> モデルは <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">age</span></code> そして <code class=\"docutils literal notranslate\"><span class=\"pre\">home_group</span></code> の 3 つのフィールドを持つことになります。 <code class=\"docutils literal notranslate\"><span class=\"pre\">CommonInfo</span></code> モデルは抽象基底クラスであるため、通常の Django モデルとしては利用できません。データベース上にテーブルを生成したりマネージャを持ったりせず、そしてインスタンス化されたり直接値を保存する事もできません。</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>大抵の状況において、このモデル継承の方式がまさにあなたが必要としていた物となるでしょう。この方式では、データベースの領域では子モデル毎に一つずつだけのテーブルを作る事しかできませんが、共通で持ちたい情報を Python の水準で分離できます。</p>\n<section id=\"meta-inheritance\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> 継承<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>抽象基底クラスを作成した際、Django は基底クラスから利用できる <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> インナークラスを全て子クラスの属性値にします。もしある子クラスが自身の <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> クラスを定義しなければ、親クラスの <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> クラスを継承します。もし子クラスが親の <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> クラスを拡張したい場合は、継承したクラスのサブクラス化が可能です。以下のようになります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<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 は抽象基底クラスの <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> クラスに対して一つの変更を施します: <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> 属性を子クラスに導入する前に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">abstract=False</span></code> を設定します。これは抽象基底クラスを継承した子クラスは自身を自動的に抽象基底クラスにはしない事を意味します。言うまでもなく、他の抽象基底クラスを継承した抽象基底クラスを作る事はできます。継承する都度 <code class=\"docutils literal notranslate\"><span class=\"pre\">abstract=True</span></code> を設定する事を忘れなければ良いだけです。</p>\n<p>抽象基底クラスの <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> クラスに持っても意味をなさない属性がいくつか存在します。例えば、属性値 <code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></code> を持つことは継承した子クラス (の中で自身の <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> を定義していない物) が全て同じデータベース上のテーブルを利用する事を意味しますが、それは期待する動作と明らかに異なるでしょう。</p>\n</section>\n<section id=\"be-careful-with-related-name-and-related-query-name\">\n<span id=\"abstract-related-name\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">related_name</span></code> と <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><code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> もしくは <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> に対して <a class=\"reference internal\" href=\"/ja/2.0/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> または <a class=\"reference internal\" href=\"/ja/2.0/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> を使う場合、そのフィールドに対して <em>一意の</em> 逆引き名およびクエリ名を常に定義しなければなりません。これは抽象基底クラスにおいて、フィールドが継承した子クラスそれぞれに含まれ、継承される毎にその属性値が完全に同じ値 (<a class=\"reference internal\" href=\"/ja/2.0/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> と <a class=\"reference internal\" href=\"/ja/2.0/ref/models/fields/#django.db.models.ForeignKey.related_query_name\" title=\"django.db.models.ForeignKey.related_query_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_query_name</span></code></a> も含む) となるため、通常問題となります。</p>\n<p>この問題に対処するため、抽象基底クラスにおいて <a class=\"reference internal\" href=\"/ja/2.0/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> もしくは <a class=\"reference internal\" href=\"/ja/2.0/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> を用いる場合(のみ)、その値の一部に <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> と <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> は、そのフィールドが利用される子クラスの、クラス名を小文字にした名前に置き換えられます。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> はその子クラスを含んでいるアプリケーション名を小文字化した値に置き換えられます。インストールされたアプリケーションは各々一意でなければならず、各アプリケーション内のモデルクラス名もまた一意でなければならないため、結果の文字列は異なったものとなります。</p></li>\n</ul>\n<p>例として、 <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>別のアプリケーションの <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><code class=\"docutils literal notranslate\"><span class=\"pre\">common.ChildA.m2m</span></code> フィールドの逆引き名は <code class=\"docutils literal notranslate\"><span class=\"pre\">common_childa_related</span></code> となりその逆引きクエリ名は <code class=\"docutils literal notranslate\"><span class=\"pre\">common_childas</span></code> となります。 <code class=\"docutils literal notranslate\"><span class=\"pre\">common.ChildB.m2m</span></code> フィールドの逆引き名は <code class=\"docutils literal notranslate\"><span class=\"pre\">common_childb_related</span></code> となりその逆引きクエリ名は <code class=\"docutils literal notranslate\"><span class=\"pre\">common_childbs</span></code> となります。最終的に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">rare.ChildB.m2m</span></code> フィールドの逆引き名は <code class=\"docutils literal notranslate\"><span class=\"pre\">rare_childb_related</span></code> となりその逆引きクエリ名は <code class=\"docutils literal notranslate\"><span class=\"pre\">rare_childbs</span></code> となります。 <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(class)s'</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> の箇所をどのように利用して related name あるいは related query name を作るのかは任意で決められますがもしこれらを利用することを忘れた場合、Django はシステムチェックを実行した時 (もしくは <a class=\"reference internal\" href=\"/ja/2.0/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>もし抽象基底クラスで <a class=\"reference internal\" href=\"/ja/2.0/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> 属性を特に定めなかった場合、その逆引き名はデフォルトでは、子クラス上で直接フィールドを呼び出した場合に通常そうなるのと同様に、末尾に <code class=\"docutils literal notranslate\"><span class=\"pre\">'_set'</span></code> を付加した子クラス名となります。例として、先のコードでは、もし <a class=\"reference internal\" href=\"/ja/2.0/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> 属性が設定されなかった場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">m2m</span></code> フィールドの逆引き名は <code class=\"docutils literal notranslate\"><span class=\"pre\">ChildA</span></code> では <code class=\"docutils literal notranslate\"><span class=\"pre\">childa_set</span></code> となり <code class=\"docutils literal notranslate\"><span class=\"pre\">ChildB</span></code> フィールドでは <code class=\"docutils literal notranslate\"><span class=\"pre\">childb_set</span></code> となります。</p>\n</section>\n</section>\n<section id=\"multi-table-inheritance\">\n<span id=\"id8\"></span><h3>複数テーブルの継承<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>Django がサポートするもう一つのモデル継承は、ヒエラルキー内の各モデルすべてが、それ自体モデルであるような場合です。それぞれのモデルはデータベース上のテーブルに対応しており、個別にクエリーを作成したり、テーブルの作成ができます。継承の関係によって、(自動的に作成される <a class=\"reference internal\" href=\"/ja/2.0/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<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>データはデータベースの異なるテーブルに存在しますが、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> のフィールドは全て <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</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\">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><code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> を取得すれば <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code> も取得することになり、小文字のモデル名を用いることで <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> オブジェクトから <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</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\">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>しかしながら、上の例において <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code> オブジェクト <em>ではない</em> (継承を用いず <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> オブジェクトが直接作成されたもしくは他のクラスの親であった)場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">p.restaurant</span></code> を参照すると <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant.DoesNotExist</span></code> 例外を創出します。</p>\n<p>The automatically-created <a class=\"reference internal\" href=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>メタクラス``と複数テーブルの継承<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>複数のテーブルを継承する状況では、子クラスにとって親クラスの <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> クラスを継承する事には意味が有りません。全ての <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> オプションは既に親クラスにおいて適用されておりそれを再度定義する事は矛盾した挙動を示すことに繋がります(これは基礎となるクラスの存在を当然の機能としては期待できない抽象基底クラスと対照的です)。</p>\n<p>そのため子モデルは親モデルの <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> クラスへのアクセスを持ちません。しかし、限られた状況において子モデルが親モデルから挙動を継承する場合が有ります:もし子モデルが <a class=\"reference internal\" href=\"/ja/2.0/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> 属性もしくは <a class=\"reference internal\" href=\"/ja/2.0/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> 属性を設定しなかった場合、これらを親モデルから継承します。</p>\n<p>もし親モデルが ordering 属性を持っており子モデルに既定のデータ並び順を持たせたくない場合、明示的に無効化する事ができます:</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>継承と関係の逆引き<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>複数テーブルの継承は親モデルと子モデルの関連付けに暗黙的な <a class=\"reference internal\" href=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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> の値を利用します。もしこの種類の関連付けを親モデルのサブクラスに対して用いる場合、 <a class=\"reference internal\" href=\"/ja/2.0/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> 属性を各フィールドに <strong>定義しなければなりません</strong> 。もし設定を忘れれば、Django はバリデーション例外を送出します。</p>\n<p>例として、上で用いた <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> クラスを再度用いて、また別のサブクラスを <a class=\"reference internal\" href=\"/ja/2.0/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>この処理の結果はエラーとなります:</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><code class=\"docutils literal notranslate\"><span class=\"pre\">customers</span></code> フィールドに <code class=\"docutils literal notranslate\"><span class=\"pre\">related_name</span></code> を追加する事でこのエラーを解消できます: <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>親モデルとのリンクに用いるフィールドを定義する<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>先に述べたように、Django は自動的に <a class=\"reference internal\" href=\"/ja/2.0/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=\"/ja/2.0/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=\"/ja/2.0/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> を設定できます。</p>\n</section>\n</section>\n<section id=\"proxy-models\">\n<span id=\"id10\"></span><h3>プロキシモデル<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><a class=\"reference internal\" href=\"#multi-table-inheritance\"><span class=\"std std-ref\">複数テーブルの継承</span></a> を利用しているとき、あるモデルのサブクラス毎に新たなデータベースのテーブルが作成されます。これは基底クラスに存在しない追加のデータフィールドをサブクラスが保存する場所が必要なため、通常必要とされる動作です。しかしながら、モデルの Python 上の振る舞いを変更したい事も有ります -- デフォルトのマネージャーを変更したり、新たなメソッドを追加したりする場合です。</p>\n<p>プロキシモデルによる継承が利用できるのはこういった状況です:オリジナルのモデルのための <em>プロキシ</em> を作るのです。プロキシモデルで通してインスタンスを作成、削除、更新して (プロキシされない) オリジナルのモデルを利用しているかのようにデータを保存できます。プロキシを利用した場合に生じる違いは、オリジナルのモデルに変更を加えることなく、デフォルトのモデルのソート順やマネージャーの設定をプロキシ上で変更できるという点です。</p>\n<p>プロキシモデルは通常のモデルと同様に定義されます。Django にそれがプロキシモデルである事を伝えるには <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの <a class=\"reference internal\" href=\"/ja/2.0/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> 属性値を <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> にします。</p>\n<p>例として、<code class=\"docutils literal notranslate\"><span class=\"pre\">Person</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\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><code class=\"docutils literal notranslate\"><span class=\"pre\">MyPerson</span></code> クラスはその親である <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> クラス同様に同じデータベースのテーブルを操作しています。特に、<code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> の新たなインスタンスは全て <code class=\"docutils literal notranslate\"><span class=\"pre\">MyPerson</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\">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>あるモデルに対して並び順の既定値を定義したい場合もプロキシモデルを利用できます。普段は <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</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=\"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>これで通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> に対する問い合わせでは特に結果は並び替えられず <code class=\"docutils literal notranslate\"><span class=\"pre\">OrderedPerson</span></code> に対する問い合わせでは <code class=\"docutils literal notranslate\"><span class=\"pre\">last_name</span></code> に基づいて並び替えられます。</p>\n<p>プロキシモデルは <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> の属性値を <a class=\"reference internal\" href=\"#meta-and-multi-table-inheritance\"><span class=\"std std-ref\">通常のモデルと同様に</span></a> 継承します。</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 はリクエストされたモデルを返し続ける<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><code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> オブジェクトに対して問い合わせた場合に Django に、あえて言えば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">MyPerson</span></code> オブジェクトを返させる事はできません。プロキシオブジェクトのポイントはオリジナルの <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> に依存しているコードはそちらを使いつつ、新たに含んだ (他のコードがどんな形であれ依存しない) 拡張を使うコードを書けるという点です。 <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> モデル (や他の全てのモデル) を新たに作った何物かに置き換える方法ではありません。</p>\n</section>\n<section id=\"base-class-restrictions\">\n<h4>基底クラスの制限<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>プロキシモデルは厳格に一つの抽象的でないモデルクラスを継承しなければなりません。複数の非抽象クラスを、異なるデータベースのテーブル上の列と列を接続しない、プロキシモデルとして継承する事はできません。プロキシモデルは、いかなるモデルのフィールドも定義 <em>しない</em> 、抽象モデルクラスをいくらでも継承できます。プロキシモデルはまた共通の非抽象な親クラスを持つプロキシモデルをいくらでも継承できます。</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>プロキシモデル上にモデルのマネージャーを定義しない場合、そのプロキシモデルはマネージャーを親のモデルから継承します。プロキシモデル上にマネージャーを定義する場合、親クラス上のマネージャーで定義されて利用可能な物が有ったとしても、そのマネージャーがデフォルトになります。</p>\n<p>前節の例を使うと、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</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\">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>既存の物を置き換えることなく、プロキシモデルに新たなマネージャーを追加したい場合は、 <a class=\"reference internal\" href=\"/ja/2.0/topics/db/managers/#custom-managers-and-inheritance\"><span class=\"std std-ref\">カスタムマネージャー</span></a> の説明に記述されたテクニックを用いることができます: 新たに実装したマネージャーを含んだ基底クラスを作成し、これを元々の基底クラスに続けて多重継承してください:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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>プロキシモデルの継承と管理対象外モデルの違い<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>プロキシモデルの継承は、あるモデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスにおける <a class=\"reference internal\" href=\"/ja/2.0/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> 属性を用いて Django に管理されないモデルを作成するのにかなり似ています。</p>\n<p><a class=\"reference internal\" href=\"/ja/2.0/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> を入念に設定する事で既に存在するモデルとそれに対応する Python メソッドを隠ぺいする管理対象外モデルを作成できます。しかしながら、この操作は変更を加えた際に定義を複製して同期する際にとても冗長で変更に弱い物となります。</p>\n<p>一方、プロキシモデルはプロキシするモデルと全く同じように振る舞うことを企図しています。それらのモデルは直接フィールドとマネージャーを継承しているため、常に親モデルに同期しています。</p>\n<p>原則としては:</p>\n<ol class=\"arabic simple\">\n<li><p>もし既存のモデルやデータベースのテーブルを反映したいが元となるテーブルのカラムの全てを必要とする訳ではない場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.managed=False</span></code> を利用してください。このオプションはデータベースのビューやテーブルを Django の管理下に置きたくない場合に通常有用となります。</p></li>\n<li><p>もしあるモデルの Python の箇所の振る舞いだけを変更したいが、元となるモデルと同じフィールドを保持したい場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.proxy=True</span></code> を使用してください。この設定はデータ保存時にプロキシモデルが、元となるモデル側の保管構造の完全な複製となるように諸々を設定します。</p></li>\n</ol>\n</section>\n</section>\n<section id=\"multiple-inheritance\">\n<span id=\"model-multiple-inheritance-topic\"></span><h3>多重継承<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>Python におけるサブクラス化と同様に、 Django のモデルは複数の親モデルを継承する事ができます。Python で通常用いられる名前解決の規則が適用されることを念頭に置いてください。特定の名称のオブジェクト (例えば <span class=\"xref std std-ref\">Meta</span> クラスを持っていた場合、最初に定義されたモデルのクラスが利用され、それ以外は無視されます。</p>\n<p>通常は複数の親モデルを継承する必要はありません。この機能が有用な主な状況はクラスの &quot;ミックスイン&quot; 、ミックスイン用クラスを継承する全てのクラスに特別なフィールドやメソッドを追加させる技術、を利用する場合です。情報の特定の箇所がどこに由来するか突き止めるため奮闘しなくて済むように、継承の依存関係を可能な限り簡単で直観的な状態で維持するようにして下さい。</p>\n<p>共通の <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> 主キーフィールドを持った複数のモデルを継承すると例外が送出されることに注意してください。多重継承を正常に使うために、基底モデル内で明示的に <a class=\"reference internal\" href=\"/ja/2.0/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> を利用できます。</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=\"/ja/2.0/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=\"/ja/2.0/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>フィールド名の &quot;隠ぺい&quot; は許可されない<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>通常の Python のクラス継承では、親クラスから継承したあらゆる属性を子クラスがオーバーライドできます。Django では、この挙動は通常モデルのフィールドに対して許容されません。もし非抽象なモデルの基底クラスが <code class=\"docutils literal notranslate\"><span class=\"pre\">author</span></code> フィールドを持っていたとしたら、そのモデルの基底クラスを継承したあらゆるモデルクラス内では <code class=\"docutils literal notranslate\"><span class=\"pre\">author</span></code> という名称の属性値を別のモデルのフィールドや属性として定義できなくなります。</p>\n<p>この制約は抽象モデルを継承したモデルのフィールドに対しては適用されません。こういったフィールドは別のフィールドや値によってオーバーライドされるか <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\">警告</p>\n<p>モデルマネージャーは抽象基底クラスより継承されます。継承された <a class=\"reference internal\" href=\"/ja/2.0/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> から参照される継承されたフィールドをオーバーライドするとちょっとしたバグを発生させる事が有ります。詳細は <a class=\"reference internal\" href=\"/ja/2.0/topics/db/managers/#custom-managers-and-inheritance\"><span class=\"std std-ref\">カスタムマネージャーとモデルの継承</span></a> を参照ください。</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>ある種のフィールドはモデル上に特別な属性を定義します、例えば <a class=\"reference internal\" href=\"/ja/2.0/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\">_id</span></code> がフィールド名に付与された属性を、外部モデル上の <code class=\"docutils literal notranslate\"><span class=\"pre\">related_name</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">related_query_name</span></code> と同じように定義します。</p>\n<p>これらの特別な属性はその属性を定義しているフィールドが、もはやその特別な属性を定義しなくなるように、変更もしくは削除されなければオーバーライドできません。</p>\n</aside>\n<p>親モデルのフィールドをオーバーライドする事はインスタンス (どのフィールドが初期化されるか <code class=\"docutils literal notranslate\"><span class=\"pre\">Model.__init__</span></code> に定義している) の初期化やシリアライズ時の問題につながります。これらは通常の Python のクラス継承で全く同様に扱う事が求められていない機能であるため、 Django のモデル継承と Python のクラス継承のこうした差異は恣意的な設計による物ではありません。</p>\n<p>この制限は <a class=\"reference internal\" href=\"/ja/2.0/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> のインスタンスである属性に対してのみ適用されます。通常の Python の属性は望むままにオーバーライドできます。またその制約は Python が解析する際の属性の名称にのみ影響します:もしデータベースのカラム名を手動で設定したい場合、複数テーブルの継承 (2 つの異なるデータベースのテーブルに保持されているカラム) を表現する際に子と祖先のモデルで同じカラム名を設定できます。</p>\n<p>もし祖先モデルのいずれかに定義されたモデルのフィールドをオーバーライドした場合 Django は <a class=\"reference internal\" href=\"/ja/2.0/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> 例外を送出します。</p>\n</section>\n</section>\n<section id=\"organizing-models-in-a-package\">\n<h2>パッケージ化したモデルを扱う<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><a class=\"reference internal\" href=\"/ja/2.0/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> コマンドを実行することで <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> ファイルを含むアプリケーション構造が作成されます。多数のモデルが存在する場合、それらを別のファイルとして管理するのが良いかもしれません。</p>\n<p>それを行うため、 <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code> パッケージを作成します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> を削除してモデルを保持するための <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code> ファイルを持つ <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp/models/</span></code> ディレクトリを作成します。作成した <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code> でモデルをインポートする必要が有ります。</p>\n<p>例えば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">organic.py</span></code> および <code class=\"docutils literal notranslate\"><span class=\"pre\">synthetic.py</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code> ディレクトリ内に持っている場合:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>myapp/models/__init__.py</code></figcaption><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=\"myapp/models/__init__.py\"><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><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> という記述を用いずに各モデルを明示的にインポートする方法には名前空間を汚染しない、可読性を向上させる、コード解析ツールを有用な状態に保つという利点が有ります。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">参考</p>\n<dl class=\"simple\">\n<dt><a class=\"reference internal\" href=\"/ja/2.0/ref/models/\"><span class=\"doc\">モデルの手引き</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":"冗長な (verbose) フィールド名","anchor":"verbose-field-names","children":[]},{"title":"リレーション","anchor":"relationships","children":[{"title":"多対一 (many-to-one) 関係","anchor":"many-to-one-relationships","children":[]},{"title":"多対多 (many-to-many) 関係","anchor":"many-to-many-relationships","children":[]},{"title":"多対多リレーションにおける追加フィールド","anchor":"extra-fields-on-many-to-many-relationships","children":[]},{"title":"一対一 (one-to-one) 関係","anchor":"one-to-one-relationships","children":[]}]},{"title":"Models across files","anchor":"models-across-files","children":[]},{"title":"フィールド名の制約","anchor":"field-name-restrictions","children":[]},{"title":"カスタムのフィールドタイプ","anchor":"custom-field-types","children":[]}]},{"title":"Meta オプション","anchor":"meta-options","children":[]},{"title":"Model attributes","anchor":"model-attributes","children":[]},{"title":"Model methods","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":"抽象基底クラス","anchor":"abstract-base-classes","children":[{"title":"Meta 継承","anchor":"meta-inheritance","children":[]},{"title":"related_name と related_query_name の利用に関して注意するべき点","anchor":"be-careful-with-related-name-and-related-query-name","children":[]}]},{"title":"複数テーブルの継承","anchor":"multi-table-inheritance","children":[{"title":"``メタクラス``と複数テーブルの継承","anchor":"meta-and-multi-table-inheritance","children":[]},{"title":"継承と関係の逆引き","anchor":"inheritance-and-reverse-relations","children":[]},{"title":"親モデルとのリンクに用いるフィールドを定義する","anchor":"specifying-the-parent-link-field","children":[]}]},{"title":"プロキシモデル","anchor":"proxy-models","children":[{"title":"QuerySets はリクエストされたモデルを返し続ける","anchor":"querysets-still-return-the-model-that-was-requested","children":[]},{"title":"基底クラスの制限","anchor":"base-class-restrictions","children":[]},{"title":"プロキシモデルマネージャー","anchor":"proxy-model-managers","children":[]},{"title":"プロキシモデルの継承と管理対象外モデルの違い","anchor":"differences-between-proxy-inheritance-and-unmanaged-models","children":[]}]},{"title":"多重継承","anchor":"multiple-inheritance","children":[]},{"title":"フィールド名の \"隠ぺい\" は許可されない","anchor":"field-name-hiding-is-not-permitted","children":[]}]},{"title":"パッケージ化したモデルを扱う","anchor":"organizing-models-in-a-package","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/2.0/topics/"},{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/2.0/topics/db/"}],"prev":{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/2.0/topics/db/"},"next":{"docname":"topics/db/queries","title":"クエリを作成する","url":"/ja/2.0/topics/db/queries/"},"formats":{"html":"/ja/2.0/topics/db/models/","markdown":"/ja/2.0/topics/db/models.md","json":"/ja/2.0/topics/db/models.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/topics/db/models.txt","official":"https://docs.djangoproject.com/ja/2.0/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","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}