{"title":"モデル","version":"1.10","locale":"ja","docname":"topics/db/models","url":"/ja/1.10/topics/db/models/","canonical":"https://djangodocs.dev/ja/1.10/topics/db/models/","summary":"モデルは、データに関する単一の決定的な情報源です。これはあなたが保持するデータが必要とするフィールドと振る舞いについての情報を持ちます。","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/1.10/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.Model</code></a> のサブクラスです。</p></li>\n<li><p>モデルの属性はそれぞれがデータベースのフィールドを表します。</p></li>\n<li><p>これら全てを用いて、Django はデータベースにアクセスする自動生成された API を提供します。 <a class=\"reference internal\" href=\"/ja/1.10/topics/db/queries/\"><span class=\"doc\">Making queries</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\">first_name</code> と <code class=\"docutils literal notranslate\">last_name</code> を持つ <code class=\"docutils literal notranslate\">Person</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n    last_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">first_name</code> および <code class=\"docutils literal notranslate\">last_name</code> はこのモデルの <a class=\"reference internal\" href=\"#fields\">フィールド</a> です。各フィールドはクラスの属性として定義され、各属性はデータベースのカラムに関連付けられます。</p>\n<p>上記の <code class=\"docutils literal notranslate\">Person</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=\"k\">TABLE</span> myapp_person <span class=\"p\">(</span>\n    <span class=\"ss\">&quot;id&quot;</span> <span class=\"nb\">serial</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span> <span class=\"k\">PRIMARY</span> <span class=\"k\">KEY</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;first_name&quot;</span> <span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">30</span><span class=\"p\">)</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;last_name&quot;</span> <span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">30</span><span class=\"p\">)</span> <span class=\"k\">NOT</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\">myapp_person</code> というテーブル名は、いくつかのモデルのメタデータから自動的に生成されますがそれを無効化する事ができます。詳細は <a class=\"reference internal\" href=\"/ja/1.10/ref/models/options/#table-names\"><span class=\"std std-ref\">Table names</span></a> を参照ください。</p></li>\n<li><p><code class=\"docutils literal notranslate\">id</code> フィールドは自動的に追加されますが、この処理を無効化する事ができます。<a class=\"reference internal\" href=\"#automatic-primary-key-fields\"><span class=\"std std-ref\">Automatic primary key fields</span></a> を参照ください。</p></li>\n<li><p>この例における <code class=\"docutils literal notranslate\">CREATE TABLE</code> の SQL は PostgreSQL の文法に準拠していますが、Django は <a class=\"reference internal\" href=\"/ja/1.10/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/1.10/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> に、定義した <code class=\"docutils literal notranslate\">models.py</code> を含むモジュール名を追加する事で行えます。</p>\n<p>例として、アプリケーションのモデルが <code class=\"docutils literal notranslate\">myapp.models</code> モジュール内に存在すれば(このパッケージ構造は <a class=\"reference internal\" href=\"/ja/1.10/ref/django-admin/#django-admin-startapp\"><code class=\"xref std std-djadmin docutils literal notranslate\">manage.py startapp</code></a> スクリプトによってアプリケーション内に構築される物です)、<a class=\"reference internal\" href=\"/ja/1.10/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</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>INSTALLED_APPS <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/1.10/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 内に新たなアプリケーションを追加した場合、<a class=\"reference internal\" href=\"/ja/1.10/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">manage.py migrate</code></a> を、初回は必要に応じて <a class=\"reference internal\" href=\"/ja/1.10/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">manage.py makemigrations</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\">clean</code>、<code class=\"docutils literal notranslate\">save</code> あるいは <code class=\"docutils literal notranslate\">delete</code> のような <a class=\"reference internal\" href=\"/ja/1.10/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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Musician</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    last_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    instrument <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Album</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    artist <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Musician<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    release_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n    num_stars <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<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/1.10/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> クラスのインスタンスとなっている必要が有ります。Django は利用しているフィールドクラスの型に応じて以下のような挙動を決定します:</p>\n<ul class=\"simple\">\n<li><p>カラムの型、データベースに保持するデータがどのような種別の物であるかを表します(例えば <code class=\"docutils literal notranslate\">INTEGER</code>、 <code class=\"docutils literal notranslate\">VARCHAR</code>、 <code class=\"docutils literal notranslate\">TEXT</code> 等です)。</p></li>\n<li><p>フォーム領域をレンダリングする際に利用するデフォルトの HTML <a class=\"reference internal\" href=\"/ja/1.10/ref/forms/widgets/\"><span class=\"doc\">ウィジェット</span></a> (例えば <code class=\"docutils literal notranslate\">&lt;input type=&quot;text&quot;&gt;</code>、 <code class=\"docutils literal notranslate\">&lt;select&gt;</code>)。</p></li>\n<li><p>最低限必要とされる入力値確認、Django の管理機能と自動生成されるフォームにおいて利用されます。</p></li>\n</ul>\n<p>Django は多くのフィールド型を内蔵しています; それらの完全な一覧は <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#model-field-types\"><span class=\"std std-ref\">フィールドの型</span></a> で確認できます。もし Django に内蔵されたフィールドの型では実現できない機能を実装したい場合は独自のフィールドを簡単に記述できます; <a class=\"reference internal\" href=\"/ja/1.10/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/1.10/ref/models/fields/#model-field-types\"><span class=\"std std-ref\">モデルのフィールド型一覧</span></a> にまとめられています) を受け取ります。例えば、<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> (およびそのサブクラス) はそのデータを保持するためにデータベース上に定義される <code class=\"docutils literal notranslate\">VARCHAR</code> 領域の長さを定義する引数 <a class=\"reference internal\" href=\"/ja/1.10/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\">max_length</code></a> を必要とします。</p>\n<p>これらに加えてまた全てのフィールドの型で利用できる共通の引数が存在します。これらは全て入力が任意の物です。これらの引数についてはこちらの <a class=\"reference internal\" href=\"/ja/1.10/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/1.10/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\">null</code></a></dt><dd><p><code class=\"docutils literal notranslate\">True``の場合、Django はデータベース内に ``NULL</code> として空の値を保持します。デフォルトは <code class=\"docutils literal notranslate\">False</code> です。</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\">blank</code></a></dt><dd><p><code class=\"docutils literal notranslate\">True</code> の場合、フィールドはブランクになることが許容されます。デフォルトは <code class=\"docutils literal notranslate\">False</code> です。</p>\n<p><a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\">null</code></a> とは挙動が異なる事に注意してください。 <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\">blank</code></a> がバリデーション由来である一方、 <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\">null</code></a> は完全にデータベース由来です。あるフィールドが <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\">blank=True</code></a> であれば、フォームのバリデーションは空の値の入力を許容します。あるフィールドが <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\">blank=False</code></a> の場合は、そのフィールドへの入力は必須となります。</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field.choices\" title=\"django.db.models.Field.choices\"><code class=\"xref py py-attr docutils literal notranslate\">choices</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>YEAR_IN_SCHOOL_CHOICES <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>各タプルの最初の要素はデータベースに保存される値となります。二番目の要素はデフォルトのフォームウィジェットあるいは <a class=\"reference internal\" href=\"/ja/1.10/ref/forms/fields/#django.forms.ModelChoiceField\" title=\"django.forms.ModelChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceField</code></a> 内で表示されます。モデルのインスタンスが存在する時、選択肢の値は <code class=\"docutils literal notranslate\">get_FOO_display()</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    SHIRT_SIZES <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    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">60</span><span class=\"p\">)</span>\n    shirt_size <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> choices<span class=\"o\">=</span>SHIRT_SIZES<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>p <span class=\"o\">=</span> Person<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Fred Flintstone&quot;</span><span class=\"p\">,</span> shirt_size<span class=\"o\">=</span><span class=\"s2\">&quot;L&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>shirt_size\n<span class=\"go\">&#39;L&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>get_shirt_size_display<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/1.10/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\">default</code></a></dt><dd><p>そのフィールドのデフォルト値です。このオプションには特定の値もしくは呼び出し可能オブジェクトを渡すことができます。もし渡した値が呼び出し可能であれば新しくオブジェクトが生成される度に呼び出されます。</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/ja/1.10/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\">help_text</code></a></dt><dd><p>フォームウィジェットと共に表示される &quot;補助&quot; テキストになります。この値はフィールドがフォームとして利用されない場合でもドキュメント化する際に有用です。</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/ja/1.10/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\">primary_key</code></a></dt><dd><p><code class=\"docutils literal notranslate\">True</code> の場合、設定したフィールドはそのモデルの主キーとなります。</p>\n<p>定義したモデル内でどのフィールドに対しても <a class=\"reference internal\" href=\"/ja/1.10/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\">primary_key=True</code></a> が設定されなかった場合、Django は自動的に主キーを保存するために <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a> を追加します、つまりその主キーに対するデフォルトの動作を変更する必要がない場合はどのフィールドに対しても <a class=\"reference internal\" href=\"/ja/1.10/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\">primary_key=True</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Fruit</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">,</span> primary_key<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>fruit <span class=\"o\">=</span> Fruit<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Apple&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>fruit<span class=\"o\">.</span>name <span class=\"o\">=</span> <span class=\"s1\">&#39;Pear&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>fruit<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Fruit<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> flat<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">[&#39;Apple&#39;, &#39;Pear&#39;]</span>\n</code></pre></div>\n</dd>\n<dt><a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\">unique</code></a></dt><dd><p><code class=\"docutils literal notranslate\">True</code> の場合、そのフィールドはテーブル上で一意となる制約を受けます。</p>\n</dd>\n</dl>\n<p>繰り返しになりますが、これらは特によく利用されるフィールドのオプションの概説です。完全な説明は <a class=\"reference internal\" href=\"/ja/1.10/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>Automatic primary key fields<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>By default, Django gives each model the following field:</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> models<span class=\"o\">.</span>AutoField<span class=\"p\">(</span>primary_key<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This is an auto-incrementing primary key.</p>\n<p>If you'd like to specify a custom primary key, just specify\n<a class=\"reference internal\" href=\"/ja/1.10/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\">primary_key=True</code></a> on one of your fields. If Django\nsees you've explicitly set <a class=\"reference internal\" href=\"/ja/1.10/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\">Field.primary_key</code></a>, it won't add the automatic\n<code class=\"docutils literal notranslate\">id</code> column.</p>\n<p>Each model requires exactly one field to have <a class=\"reference internal\" href=\"/ja/1.10/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\">primary_key=True</code></a> (either explicitly declared or automatically added).</p>\n</section>\n<section id=\"verbose-field-names\">\n<span id=\"id2\"></span><h3>Verbose field names<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/1.10/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>,\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> and\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</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\">&quot;person's first name&quot;</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>first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span><span class=\"s2\">&quot;person&#39;s first name&quot;</span><span class=\"p\">,</span> max_length<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\">&quot;first name&quot;</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>first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<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/1.10/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>,\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> and\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> require the first argument to be a\nmodel class, so use the <a class=\"reference internal\" href=\"/ja/1.10/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\">verbose_name</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>poll <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n    Poll<span class=\"p\">,</span>\n    on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n    verbose_name<span class=\"o\">=</span><span class=\"s2\">&quot;the related poll&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\nsites <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Site<span class=\"p\">,</span> verbose_name<span class=\"o\">=</span><span class=\"s2\">&quot;list of sites&quot;</span><span class=\"p\">)</span>\nplace <span class=\"o\">=</span> models<span class=\"o\">.</span>OneToOneField<span class=\"p\">(</span>\n    Place<span class=\"p\">,</span>\n    on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n    verbose_name<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/1.10/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\">verbose_name</code></a>. Django will automatically capitalize the first\nletter where it needs to.</p>\n</section>\n<section id=\"relationships\">\n<h3>Relationships<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 relationships<a class=\"heading-anchor\" href=\"#many-to-one-relationships\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>To define a many-to-one relationship, use <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.ForeignKey</code></a>.\nYou use it just like any other <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> type: by\nincluding it as a class attribute of your model.</p>\n<p><a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</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\">Car</code> model has a <code class=\"docutils literal notranslate\">Manufacturer</code> -- that is, a\n<code class=\"docutils literal notranslate\">Manufacturer</code> makes multiple cars but each <code class=\"docutils literal notranslate\">Car</code> only has one\n<code class=\"docutils literal notranslate\">Manufacturer</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Manufacturer</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Car</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    manufacturer <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Manufacturer<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<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/1.10/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/1.10/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/1.10/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/1.10/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> field (<code class=\"docutils literal notranslate\">manufacturer</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=\"nc\">Car</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    company_that_makes_it <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        Manufacturer<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">参考</p>\n<p><a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> fields accept a number of extra\narguments which are explained in <a class=\"reference internal\" href=\"/ja/1.10/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/1.10/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/1.10/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 relationships<a class=\"heading-anchor\" href=\"#many-to-many-relationships\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>To define a many-to-many relationship, use\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>. You use it just like any other\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> type: by including it as a class attribute of\nyour model.</p>\n<p><a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</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\">Pizza</code> has multiple <code class=\"docutils literal notranslate\">Topping</code> objects -- that is, a\n<code class=\"docutils literal notranslate\">Topping</code> can be on multiple pizzas and each <code class=\"docutils literal notranslate\">Pizza</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Topping</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Pizza</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    toppings <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Topping<span class=\"p\">)</span>\n</code></pre></div>\n<p>As with <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>, you can also create\n<a class=\"reference internal\" href=\"/ja/1.10/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/1.10/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/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> (<code class=\"docutils literal notranslate\">toppings</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/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</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/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</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\">toppings</code> is in <code class=\"docutils literal notranslate\">Pizza</code> (rather than <code class=\"docutils literal notranslate\">Topping</code> having a <code class=\"docutils literal notranslate\">pizzas</code>\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</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\">Pizza</code> form would let users select the toppings.</p>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">参考</p>\n<p>See the <a class=\"reference internal\" href=\"/ja/1.10/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/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> fields also accept a number of\nextra arguments which are explained in <a class=\"reference internal\" href=\"/ja/1.10/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>Extra fields on many-to-many relationships<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/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</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/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</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/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> using the\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ManyToManyField.through\" title=\"django.db.models.ManyToManyField.through\"><code class=\"xref py py-attr docutils literal notranslate\">through</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>              <span class=\"c1\"># __unicode__ on Python 2</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>name\n\n<span class=\"k\">class</span> <span class=\"nc\">Group</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">)</span>\n    members <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Person<span class=\"p\">,</span> through<span class=\"o\">=</span><span class=\"s1\">&#39;Membership&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>              <span class=\"c1\"># __unicode__ on Python 2</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>name\n\n<span class=\"k\">class</span> <span class=\"nc\">Membership</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    person <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Person<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    group <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Group<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    date_joined <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n    invite_reason <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<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>There are a few restrictions on the intermediate model:</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\">Group</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/1.10/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\">ManyToManyField.through_fields</code></a>.\nIf you have more than one foreign key and <code class=\"docutils literal notranslate\">through_fields</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\">Person</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\">through_fields</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/1.10/ref/models/fields/#django.db.models.ManyToManyField.symmetrical\" title=\"django.db.models.ManyToManyField.symmetrical\"><code class=\"xref py py-attr docutils literal notranslate\">symmetrical=False</code></a> (see\n<a class=\"reference internal\" href=\"/ja/1.10/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/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> to use\nyour intermediary model (<code class=\"docutils literal notranslate\">Membership</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>ringo <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Ringo Starr&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>paul <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Paul McCartney&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>beatles <span class=\"o\">=</span> Group<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;The Beatles&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>m1 <span class=\"o\">=</span> Membership<span class=\"p\">(</span>person<span class=\"o\">=</span>ringo<span class=\"p\">,</span> group<span class=\"o\">=</span>beatles<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    date_joined<span class=\"o\">=</span>date<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>    invite_reason<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>m1<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>beatles<span class=\"o\">.</span>members<span class=\"o\">.</span>all<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>ringo<span class=\"o\">.</span>group_set<span class=\"o\">.</span>all<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>m2 <span class=\"o\">=</span> Membership<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>person<span class=\"o\">=</span>paul<span class=\"p\">,</span> group<span class=\"o\">=</span>beatles<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    date_joined<span class=\"o\">=</span>date<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>    invite_reason<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>beatles<span class=\"o\">.</span>members<span class=\"o\">.</span>all<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\">add()</code>, <code class=\"docutils literal notranslate\">create()</code>,\nor <code class=\"docutils literal notranslate\">set()</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>beatles<span class=\"o\">.</span>members<span class=\"o\">.</span>add<span class=\"p\">(</span>john<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>beatles<span class=\"o\">.</span>members<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;George Harrison&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>beatles<span class=\"o\">.</span>members<span class=\"o\">.</span>set<span class=\"p\">([</span>john<span class=\"p\">,</span> paul<span class=\"p\">,</span> ringo<span class=\"p\">,</span> george<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\">Person</code> and a <code class=\"docutils literal notranslate\">Group</code>\n- you need to specify all the detail for the relationship required by the\n<code class=\"docutils literal notranslate\">Membership</code> model. The simple <code class=\"docutils literal notranslate\">add</code>, <code class=\"docutils literal notranslate\">create</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/1.10/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\">remove()</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\">(model1, model2)</code> pair, a <code class=\"docutils literal notranslate\">remove()</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>Membership<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>person<span class=\"o\">=</span>ringo<span class=\"p\">,</span> group<span class=\"o\">=</span>beatles<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    date_joined<span class=\"o\">=</span>date<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>    invite_reason<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>beatles<span class=\"o\">.</span>members<span class=\"o\">.</span>all<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>beatles<span class=\"o\">.</span>members<span class=\"o\">.</span>remove<span class=\"p\">(</span>ringo<span class=\"p\">)</span>\n</code></pre></div>\n<p>However, the <a class=\"reference internal\" href=\"/ja/1.10/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\">clear()</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>beatles<span class=\"o\">.</span>members<span class=\"o\">.</span>clear<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>Membership<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<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> Group<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>members__name__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;Paul&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span>QuerySet <span class=\"p\">[</span><span class=\"o\">&lt;</span>Group<span class=\"p\">:</span> The Beatles<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> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"o\">...</span>     group__name<span class=\"o\">=</span><span class=\"s1\">&#39;The Beatles&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>     membership__date_joined__gt<span class=\"o\">=</span>date<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>QuerySet <span class=\"p\">[</span><span class=\"o\">&lt;</span>Person<span class=\"p\">:</span> Ringo Starr<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\">Membership</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>ringos_membership <span class=\"o\">=</span> Membership<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>group<span class=\"o\">=</span>beatles<span class=\"p\">,</span> person<span class=\"o\">=</span>ringo<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>ringos_membership<span class=\"o\">.</span>date_joined\n<span class=\"go\">datetime.date(1962, 8, 16)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>ringos_membership<span class=\"o\">.</span>invite_reason\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/1.10/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\">Person</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>ringos_membership <span class=\"o\">=</span> ringo<span class=\"o\">.</span>membership_set<span class=\"o\">.</span>get<span class=\"p\">(</span>group<span class=\"o\">=</span>beatles<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>ringos_membership<span class=\"o\">.</span>date_joined\n<span class=\"go\">datetime.date(1962, 8, 16)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>ringos_membership<span class=\"o\">.</span>invite_reason\n<span class=\"go\">&#39;Needed a new drummer.&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"one-to-one-relationships\">\n<h4>One-to-one relationships<a class=\"heading-anchor\" href=\"#one-to-one-relationships\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>To define a one-to-one relationship, use\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a>. You use it just like any other\n<code class=\"docutils literal notranslate\">Field</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/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</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\">Restaurant</code> model, you could make <code class=\"docutils literal notranslate\">Restaurant</code> have\na <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> to <code class=\"docutils literal notranslate\">Place</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/1.10/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>, a <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#recursive-relationships\"><span class=\"std std-ref\">recursive relationship</span></a> can be defined and <a class=\"reference internal\" href=\"/ja/1.10/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\" role=\"note\">\n<p class=\"admonition-title\">参考</p>\n<p>See the <a class=\"reference internal\" href=\"/ja/1.10/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/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> fields also accept an optional\n<a class=\"reference internal\" href=\"/ja/1.10/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\">parent_link</code></a> argument.</p>\n<p><a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</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/1.10/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\">primary_key</code></a> argument if you like).\nThus, it's now possible to have multiple fields of type\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</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>It's perfectly OK to relate a model to one from another app. To do this, import\nthe related model at the top of the file where your model is defined. Then,\njust refer to the other model class wherever needed. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">geography.models</span> <span class=\"kn\">import</span> ZipCode\n\n<span class=\"k\">class</span> <span class=\"nc\">Restaurant</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    zip_code <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        ZipCode<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>SET_NULL<span class=\"p\">,</span>\n        blank<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        null<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>Field name restrictions<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 places only two restrictions on model field names:</p>\n<ol class=\"arabic\">\n<li><p>A field name cannot be a Python reserved word, because that would result\nin a Python syntax error. 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=\"nc\">Example</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"k\">pass</span> <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span> <span class=\"c1\"># &#39;pass&#39; is a reserved word!</span>\n</code></pre></div>\n</li>\n<li><p>A field name cannot contain more than one underscore in a row, due to\nthe way Django's query lookup syntax works. 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=\"nc\">Example</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    foo__bar <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<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>These limitations can be worked around, though, because your field name doesn't\nnecessarily have to match your database column name. See the\n<a class=\"reference internal\" href=\"/ja/1.10/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\">db_column</code></a> option.</p>\n<p>SQL reserved words, such as <code class=\"docutils literal notranslate\">join</code>, <code class=\"docutils literal notranslate\">where</code> or <code class=\"docutils literal notranslate\">select</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>Custom field types<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/1.10/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\">Meta</code> options<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\">class Meta</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Ox</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    horn_length <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        ordering <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;horn_length&quot;</span><span class=\"p\">]</span>\n        verbose_name_plural <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/1.10/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\">ordering</code></a>), database table name (<a class=\"reference internal\" href=\"/ja/1.10/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\">db_table</code></a>), or\nhuman-readable singular and plural names (<a class=\"reference internal\" href=\"/ja/1.10/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\">verbose_name</code></a> and\n<a class=\"reference internal\" href=\"/ja/1.10/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\">verbose_name_plural</code></a>). None are required, and adding <code class=\"docutils literal notranslate\">class\nMeta</code> to a model is completely optional.</p>\n<p>A complete list of all possible <code class=\"docutils literal notranslate\">Meta</code> options can be found in the <a class=\"reference internal\" href=\"/ja/1.10/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\">objects</code></dt><dd><p>The most important attribute of a model is the\n<a class=\"reference internal\" href=\"/ja/1.10/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</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/1.10/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\">Manager</code> is defined, the default name is\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/class/#django.db.models.Model.objects\" title=\"django.db.models.Model.objects\"><code class=\"xref py py-attr docutils literal notranslate\">objects</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/1.10/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    last_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    birth_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n\n    <span class=\"k\">def</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=\"nn\">datetime</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>birth_date <span class=\"o\">&lt;</span> datetime<span class=\"o\">.</span>date<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>birth_date <span class=\"o\">&lt;</span> datetime<span class=\"o\">.</span>date<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=\"k\">def</span> <span class=\"nf\">_get_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>first_name<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span>last_name<span class=\"p\">)</span>\n    full_name <span class=\"o\">=</span> <span class=\"nb\">property</span><span class=\"p\">(</span>_get_full_name<span class=\"p\">)</span>\n</code></pre></div>\n<p>The last method in this example is a <a class=\"reference internal\" href=\"/ja/1.10/glossary/#term-property\"><span class=\"xref std std-term\">property</span></a>.</p>\n<p>The <a class=\"reference internal\" href=\"/ja/1.10/ref/models/instances/\"><span class=\"doc\">model instance reference</span></a> has a complete list\nof <a class=\"reference internal\" href=\"/ja/1.10/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/1.10/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\">__str__()</code></a> (Python 3)</dt><dd><p>A Python &quot;magic method&quot; that returns a unicode &quot;representation&quot; 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><code class=\"docutils literal notranslate\">__unicode__()</code> (Python 2)</dt><dd><p>Python 2 equivalent of <code class=\"docutils literal notranslate\">__str__()</code>.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/ja/1.10/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\">get_absolute_url()</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/1.10/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/1.10/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> and\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/instances/#django.db.models.Model.delete\" title=\"django.db.models.Model.delete\"><code class=\"xref py py-meth docutils literal notranslate\">delete()</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/1.10/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Blog</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    tagline <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">save</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        do_something<span class=\"p\">()</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span>Blog<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>save<span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span> <span class=\"c1\"># Call the &quot;real&quot; save() method.</span>\n        do_something_else<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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Blog</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    tagline <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">save</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>name <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>Blog<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>save<span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<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\">super(Blog, self).save(*args, **kwargs)</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\">*args, **kwargs</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\">*args,\n**kwargs</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\" role=\"note\">\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/1.10/ref/models/instances/#django.db.models.Model.delete\" title=\"django.db.models.Model.delete\"><code class=\"xref py py-meth docutils literal notranslate\">delete()</code></a> method for an object is not\nnecessarily called when <a class=\"reference internal\" href=\"/ja/1.10/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/1.10/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\">cascading\ndelete</code></a>. To ensure customized\ndelete logic gets executed, you can use\n<a class=\"reference internal\" href=\"/ja/1.10/ref/signals/#django.db.models.signals.pre_delete\" title=\"django.db.models.signals.pre_delete\"><code class=\"xref py py-data docutils literal notranslate\">pre_delete</code></a> and/or\n<a class=\"reference internal\" href=\"/ja/1.10/ref/signals/#django.db.models.signals.post_delete\" title=\"django.db.models.signals.post_delete\"><code class=\"xref py py-data docutils literal notranslate\">post_delete</code></a> signals.</p>\n<p>Unfortunately, there isn't a workaround when\n<a class=\"reference internal\" href=\"/ja/1.10/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\">creating</code></a> or\n<a class=\"reference internal\" href=\"/ja/1.10/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\">updating</code></a> objects in bulk,\nsince none of <a class=\"reference internal\" href=\"/ja/1.10/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a>,\n<a class=\"reference internal\" href=\"/ja/1.10/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-data docutils literal notranslate\">pre_save</code></a>, and\n<a class=\"reference internal\" href=\"/ja/1.10/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-data docutils literal notranslate\">post_save</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/1.10/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/1.10/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.Model</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>抽象基底クラスは大量のモデルに共通の情報を持たせたい場合に有用です。基礎となるクラスを記述してその <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> クラス内に <code class=\"docutils literal notranslate\">abstract=True</code> を記述します。そうするとそのモデルはデータベース上にテーブルを構築するために用いられることは無くなります。その変わり、他のモデルの基底クラスとして用いられた場合、そのモデル上のフィールドは子クラスのフィールドに追加されます。抽象基底クラスに定義したのと同じ名前のフィールドが継承した子に存在する場合はエラーとなります (Django が例外を送出します)。</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">CommonInfo</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    age <span class=\"o\">=</span> models<span class=\"o\">.</span>PositiveIntegerField<span class=\"p\">()</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        abstract <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Student</span><span class=\"p\">(</span>CommonInfo<span class=\"p\">):</span>\n    home_group <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Student</code> モデルは <code class=\"docutils literal notranslate\">name</code>、<code class=\"docutils literal notranslate\">age</code> そして <code class=\"docutils literal notranslate\">home_group</code> の 3 つのフィールドを持つことになります。 <code class=\"docutils literal notranslate\">CommonInfo</code> モデルは抽象基底クラスであるため、通常の Django モデルとしては利用できません。データベース上にテーブルを生成したりマネージャを持ったりせず、そしてインスタンス化されたり直接値を保存する事もできません。</p>\n<p>大抵の状況において、このモデル継承の方式がまさにあなたが必要としていた物となるでしょう。この方式では、データベースの領域では子モデル毎に一つずつだけのテーブルを作る事しかできませんが、共通で持ちたい情報を Python の水準で分離できます。</p>\n<section id=\"meta-inheritance\">\n<h4><code class=\"docutils literal notranslate\">Meta</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">CommonInfo</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        abstract <span class=\"o\">=</span> <span class=\"kc\">True</span>\n        ordering <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=\"nc\">Student</span><span class=\"p\">(</span>CommonInfo<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">(</span>CommonInfo<span class=\"o\">.</span>Meta<span class=\"p\">):</span>\n        db_table <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\">abstract=False</code> を設定します。これは抽象基底クラスを継承した子クラスは自身を自動的に抽象基底クラスにはしない事を意味します。言うまでもなく、他の抽象基底クラスを継承した抽象基底クラスを作る事はできます。継承する都度 <code class=\"docutils literal notranslate\">abstract=True</code> を設定する事を忘れなければ良いだけです。</p>\n<p>抽象基底クラスの <a class=\"reference internal\" href=\"#meta-options\"><span class=\"std std-ref\">Meta</span></a> クラスに持っても意味をなさない属性がいくつか存在します。例えば、属性値 <code class=\"docutils literal notranslate\">db_table</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\">related_name</code> と <code class=\"docutils literal notranslate\">related_query_name</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\">ForeignKey</code> もしくは <code class=\"docutils literal notranslate\">ManyToManyField</code> に対して <a class=\"reference internal\" href=\"/ja/1.10/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\">related_name</code></a> または <a class=\"reference internal\" href=\"/ja/1.10/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\">related_query_name</code></a> を使う場合、そのフィールドに対して <em>一意の</em> 逆引き名およびクエリ名を常に定義しなければなりません。これは抽象基底クラスにおいて、フィールドが継承した子クラスそれぞれに含まれ、継承される毎にその属性値が完全に同じ値 (<a class=\"reference internal\" href=\"/ja/1.10/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\">related_name</code></a> と <a class=\"reference internal\" href=\"/ja/1.10/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\">related_query_name</code></a> も含む) となるため、通常問題となります。</p>\n<p>この問題に対処するため、抽象基底クラスにおいて <a class=\"reference internal\" href=\"/ja/1.10/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\">related_name</code></a> もしくは <a class=\"reference internal\" href=\"/ja/1.10/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\">related_query_name</code></a> を用いる場合(のみ)、その値の一部に <code class=\"docutils literal notranslate\">'%(app_label)s'</code> と <code class=\"docutils literal notranslate\">'%(class)s'</code> を含まなければなりません。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">'%(class)s'</code> はそのフィールドが利用される子クラスのクラス名を小文字化した物に置き換えられます。</p></li>\n<li><p><code class=\"docutils literal notranslate\">'%(app_label)s'</code> はその子クラスを含んでいるアプリケーション名を小文字化した値に置き換えられます。インストールされたアプリケーションは各々一意でなければならず、各アプリケーション内のモデルクラス名もまた一意でなければならないため、結果の文字列は異なったものとなります。</p></li>\n</ul>\n<p>例として、 <code class=\"docutils literal notranslate\">common/models.py</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Base</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    m2m <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>\n        OtherModel<span class=\"p\">,</span>\n        related_name<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        related_query_name<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=\"nc\">Meta</span><span class=\"p\">:</span>\n        abstract <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">ChildA</span><span class=\"p\">(</span>Base<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">ChildB</span><span class=\"p\">(</span>Base<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>別のアプリケーションの <code class=\"docutils literal notranslate\">rare/models.py</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=\"nn\">common.models</span> <span class=\"kn\">import</span> Base\n\n<span class=\"k\">class</span> <span class=\"nc\">ChildB</span><span class=\"p\">(</span>Base<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">common.ChildA.m2m</code> フィールドの逆引き名は <code class=\"docutils literal notranslate\">common_childa_related</code> となりその逆引きクエリ名は <code class=\"docutils literal notranslate\">common_childas</code> となります。 <code class=\"docutils literal notranslate\">common.ChildB.m2m</code> フィールドの逆引き名は <code class=\"docutils literal notranslate\">common_childb_related</code> となりその逆引きクエリ名は <code class=\"docutils literal notranslate\">common_childbs</code> となります。最終的に、 <code class=\"docutils literal notranslate\">rare.ChildB.m2m</code> フィールドの逆引き名は <code class=\"docutils literal notranslate\">rare_childb_related</code> となりその逆引きクエリ名は <code class=\"docutils literal notranslate\">rare_childbs</code> となります。 <code class=\"docutils literal notranslate\">'%(class)s'</code> と <code class=\"docutils literal notranslate\">'%(app_label)s'</code> の箇所をどのように利用して related name あるいは related query name を作るのかは任意で決められますがもしこれらを利用することを忘れた場合、Django はシステムチェックを実行した時 (もしくは <a class=\"reference internal\" href=\"/ja/1.10/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> を実行した時) にエラーを発生させます。</p>\n<p>もし抽象基底クラスで <a class=\"reference internal\" href=\"/ja/1.10/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\">related_name</code></a> 属性を特に定めなかった場合、その逆引き名はデフォルトでは、子クラス上で直接フィールドを呼び出した場合に通常そうなるのと同様に、末尾に <code class=\"docutils literal notranslate\">'_set'</code> を付加した子クラス名となります。例として、先のコードでは、もし <a class=\"reference internal\" href=\"/ja/1.10/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\">related_name</code></a> 属性が設定されなかった場合、 <code class=\"docutils literal notranslate\">m2m</code> フィールドの逆引き名は <code class=\"docutils literal notranslate\">ChildA</code> では <code class=\"docutils literal notranslate\">childa_set</code> となり <code class=\"docutils literal notranslate\">ChildB</code> フィールドでは <code class=\"docutils literal notranslate\">childb_set</code> となります。</p>\n<aside class=\"version-note version-changed\" data-version=\"1.10\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.10</p><p><code class=\"docutils literal notranslate\">related_query_name</code> に対する <code class=\"docutils literal notranslate\">'%(app_label)s'</code> および <code class=\"docutils literal notranslate\">'%(class)s'</code> の補完が追加されました。</p>\n</aside>\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/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Place</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    address <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">80</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Restaurant</span><span class=\"p\">(</span>Place<span class=\"p\">):</span>\n    serves_hot_dogs <span class=\"o\">=</span> models<span class=\"o\">.</span>BooleanField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n    serves_pizza <span class=\"o\">=</span> models<span class=\"o\">.</span>BooleanField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>データはデータベースの異なるテーブルに存在しますが、 <code class=\"docutils literal notranslate\">Place</code> のフィールドは全て <code class=\"docutils literal notranslate\">Restaurant</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>Place<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name<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>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name<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\">Place</code> を取得すれば <code class=\"docutils literal notranslate\">Restaurant</code> も取得することになり、小文字のモデル名を用いることで <code class=\"docutils literal notranslate\">Place</code> オブジェクトから <code class=\"docutils literal notranslate\">Restaurant</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>p <span class=\"o\">=</span> Place<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<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>p<span class=\"o\">.</span>restaurant\n<span class=\"go\">&lt;Restaurant: ...&gt;</span>\n</code></pre></div>\n<p>しかしながら、上の例において <code class=\"docutils literal notranslate\">p</code> が <code class=\"docutils literal notranslate\">Restaurant</code> オブジェクト <em>ではない</em> (継承を用いず <code class=\"docutils literal notranslate\">Place</code> オブジェクトが直接作成されたもしくは他のクラスの親であった)場合、 <code class=\"docutils literal notranslate\">p.restaurant</code> を参照すると <code class=\"docutils literal notranslate\">Restaurant.DoesNotExist</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/1.10/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\">ordering</code></a> 属性もしくは <a class=\"reference internal\" href=\"/ja/1.10/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\">get_latest_by</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=\"nc\">ChildModel</span><span class=\"p\">(</span>ParentModel<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Remove parent&#39;s ordering effect</span>\n        ordering <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/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> を利用するため、先の例で示されたように、親から子に情報を移動させることは可能です。しかしその関連付けには  <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> および <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> に付与されたデフォルトの <a class=\"reference internal\" href=\"/ja/1.10/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\">related_name</code></a> の値を利用します。もしこの種類の関連付けを親モデルのサブクラスに対して用いる場合、 <a class=\"reference internal\" href=\"/ja/1.10/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\">related_name</code></a> 属性を各フィールドに <strong>定義しなければなりません</strong> 。もし設定を忘れれば、Django はバリデーション例外を送出します。</p>\n<p>例として、上で用いた <code class=\"docutils literal notranslate\">Place</code> クラスを再度用いて、また別のサブクラスを <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</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=\"nc\">Supplier</span><span class=\"p\">(</span>Place<span class=\"p\">):</span>\n    customers <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Place<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>Reverse query name <span class=\"k\">for</span> <span class=\"s1\">&#39;Supplier.customers&#39;</span> clashes <span class=\"k\">with</span> reverse query\nname <span class=\"k\">for</span> <span class=\"s1\">&#39;Supplier.place_ptr&#39;</span><span class=\"o\">.</span>\n\nHINT<span class=\"p\">:</span> Add <span class=\"ow\">or</span> change a related_name argument to the definition <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\">customers</code> フィールドに <code class=\"docutils literal notranslate\">related_name</code> を追加する事でこのエラーを解消できます: <code class=\"docutils literal notranslate\">models.ManyToManyField(Place, related_name='provider')</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/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> による子クラスから抽象クラスでないあらゆる親モデルへの関連付けを自動的に作ります。もしこの親モデルを指す属性値の名前を設定したい場合は、あるフィールドが親クラスに関連を逆引きするための物であることを示すために、独自の  <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> を作り <a class=\"reference internal\" href=\"/ja/1.10/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\">parent_link=True</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\">Meta</code> クラスの <a class=\"reference internal\" href=\"/ja/1.10/ref/models/options/#django.db.models.Options.proxy\" title=\"django.db.models.Options.proxy\"><code class=\"xref py py-attr docutils literal notranslate\">proxy</code></a> 属性値を <code class=\"docutils literal notranslate\">True</code> にします。</p>\n<p>例として、<code class=\"docutils literal notranslate\">Person</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n    last_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">MyPerson</span><span class=\"p\">(</span>Person<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        proxy <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</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\">MyPerson</code> クラスはその親である <code class=\"docutils literal notranslate\">Person</code> クラス同様に同じデータベースのテーブルを操作しています。特に、<code class=\"docutils literal notranslate\">Person</code> の新たなインスタンスは全て <code class=\"docutils literal notranslate\">MyPerson</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>p <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;foobar&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>MyPerson<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>first_name<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\">Person</code> モデルの並び順を特に指定していないが、定期的に <code class=\"docutils literal notranslate\">last_name</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=\"nc\">OrderedPerson</span><span class=\"p\">(</span>Person<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        ordering <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">]</span>\n        proxy <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>これで通常の <code class=\"docutils literal notranslate\">Person</code> に対する問い合わせでは特に結果は並び替えられず <code class=\"docutils literal notranslate\">OrderedPerson</code> に対する問い合わせでは <code class=\"docutils literal notranslate\">last_name</code> に基づいて並び替えられます。</p>\n<p>プロキシモデルは <code class=\"docutils literal notranslate\">Meta</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\">QuerySet</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\">Person</code> オブジェクトに対して問い合わせた場合に Django に、あえて言えば、 <code class=\"docutils literal notranslate\">MyPerson</code> オブジェクトを返させる事はできません。プロキシオブジェクトのポイントはオリジナルの <code class=\"docutils literal notranslate\">Person</code> に依存しているコードはそちらを使いつつ、新たに含んだ (他のコードがどんな形であれ依存しない) 拡張を使うコードを書けるという点です。 <code class=\"docutils literal notranslate\">Person</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<aside class=\"version-note version-changed\" data-version=\"1.10\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.10</p><p>これより前のバージョンでは、プロキシモデルは同じ親クラスを持つプロキシモデルを二つ以上継承できませんでした。</p>\n</aside>\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\">Person</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">NewManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">MyPerson</span><span class=\"p\">(</span>Person<span class=\"p\">):</span>\n    objects <span class=\"o\">=</span> NewManager<span class=\"p\">()</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        proxy <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>既存の物を置き換えることなく、プロキシモデルに新たなマネージャーを追加したい場合は、 <a class=\"reference internal\" href=\"/ja/1.10/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=\"nc\">ExtraManagers</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    secondary <span class=\"o\">=</span> NewManager<span class=\"p\">()</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        abstract <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">MyPerson</span><span class=\"p\">(</span>Person<span class=\"p\">,</span> ExtraManagers<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        proxy <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\">Meta</code> クラスにおける <a class=\"reference internal\" href=\"/ja/1.10/ref/models/options/#django.db.models.Options.managed\" title=\"django.db.models.Options.managed\"><code class=\"xref py py-attr docutils literal notranslate\">managed</code></a> 属性を用いて Django に管理されないモデルを作成するのにかなり似ています。</p>\n<p><a class=\"reference internal\" href=\"/ja/1.10/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\">Meta.db_table</code></a> を入念に設定する事で既に存在するモデルとそれに対応する Python メソッドを隠ぺいする管理対象外モデルを作成できます。しかしながら、この操作は変更を加えた際に定義を複製して同期する際にとても冗長で変更に弱い物となります。</p>\n<p>一方、プロキシモデルはプロキシするモデルと全く同じように振る舞うことを企図しています。それらのモデルは直接フィールドとマネージャーを継承しているため、常に親モデルに同期しています。</p>\n<p>原則としては:</p>\n<ol class=\"arabic simple\">\n<li><p>もし既存のモデルやデータベースのテーブルを反映したいが元となるテーブルのカラムの全てを必要とする訳ではない場合は、 <code class=\"docutils literal notranslate\">Meta.managed=False</code> を利用してください。このオプションはデータベースのビューやテーブルを Django の管理下に置きたくない場合に通常有用となります。</p></li>\n<li><p>もしあるモデルの Python の箇所の振る舞いだけを変更したいが、元となるモデルと同じフィールドを保持したい場合は <code class=\"docutils literal notranslate\">Meta.proxy=True</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\">id</code> 主キーフィールドを持った複数のモデルを継承すると例外が送出されることに注意してください。多重継承を正常に使うために、基底モデル内で明示的に <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\">AutoField</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=\"nc\">Article</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    article_id <span class=\"o\">=</span> models<span class=\"o\">.</span>AutoField<span class=\"p\">(</span>primary_key<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=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    book_id <span class=\"o\">=</span> models<span class=\"o\">.</span>AutoField<span class=\"p\">(</span>primary_key<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=\"nc\">BookReview</span><span class=\"p\">(</span>Book<span class=\"p\">,</span> Article<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>もしくは共通の祖先となるモデルに <a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\">AutoField</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=\"nc\">Piece</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Article</span><span class=\"p\">(</span>Piece<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>Piece<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">BookReview</span><span class=\"p\">(</span>Book<span class=\"p\">,</span> Article<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\">author</code> フィールドを持っていたとしたら、そのモデルの基底クラスを継承したあらゆるモデルクラス内では <code class=\"docutils literal notranslate\">author</code> という名称の属性値を別のモデルのフィールドや属性として定義できなくなります。</p>\n<p>この制約は抽象モデルを継承したモデルのフィールドに対しては適用されません。こういったフィールドは別のフィールドや値によってオーバーライドされるか <code class=\"docutils literal notranslate\">field_name = None</code> を設定することで削除する事ができます:</p>\n<aside class=\"version-note version-changed\" data-version=\"1.10\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.10</p><p>The ability to override abstract fields was added.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>Model managers are inherited from abstract base classes. Overriding an\ninherited field which is referenced by an inherited\n<a class=\"reference internal\" href=\"/ja/1.10/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> may cause subtle bugs. See <a class=\"reference internal\" href=\"/ja/1.10/topics/db/managers/#custom-managers-and-inheritance\"><span class=\"std std-ref\">custom\nmanagers and model inheritance</span></a>.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>Some fields define extra attributes on the model, e.g. a\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> defines an extra attribute with\n<code class=\"docutils literal notranslate\">_id</code> appended to the field name, as well as <code class=\"docutils literal notranslate\">related_name</code> and\n<code class=\"docutils literal notranslate\">related_query_name</code> on the foreign model.</p>\n<p>These extra attributes cannot be overridden unless the field that defines\nit is changed or removed so that it no longer defines the extra attribute.</p>\n</aside>\n<p>Overriding fields in a parent model leads to difficulties in areas such as\ninitializing new instances (specifying which field is being initialized in\n<code class=\"docutils literal notranslate\">Model.__init__</code>) and serialization. These are features which normal Python\nclass inheritance doesn't have to deal with in quite the same way, so the\ndifference between Django model inheritance and Python class inheritance isn't\narbitrary.</p>\n<p>This restriction only applies to attributes which are\n<a class=\"reference internal\" href=\"/ja/1.10/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> instances. Normal Python attributes\ncan be overridden if you wish. It also only applies to the name of the\nattribute as Python sees it: if you are manually specifying the database\ncolumn name, you can have the same column name appearing in both a child and\nan ancestor model for multi-table inheritance (they are columns in two\ndifferent database tables).</p>\n<p>Django will raise a <a class=\"reference internal\" href=\"/ja/1.10/ref/exceptions/#django.core.exceptions.FieldError\" title=\"django.core.exceptions.FieldError\"><code class=\"xref py py-exc docutils literal notranslate\">FieldError</code></a> if you override\nany model field in any ancestor model.</p>\n</section>\n</section>\n<section id=\"organizing-models-in-a-package\">\n<h2>Organizing models in a package<a class=\"heading-anchor\" href=\"#organizing-models-in-a-package\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The <a class=\"reference internal\" href=\"/ja/1.10/ref/django-admin/#django-admin-startapp\"><code class=\"xref std std-djadmin docutils literal notranslate\">manage.py startapp</code></a> command creates an application\nstructure that includes a <code class=\"docutils literal notranslate\">models.py</code> file. If you have many models,\norganizing them in separate files may be useful.</p>\n<p>To do so, create a <code class=\"docutils literal notranslate\">models</code> package. Remove <code class=\"docutils literal notranslate\">models.py</code> and create a\n<code class=\"docutils literal notranslate\">myapp/models/</code> directory with an <code class=\"docutils literal notranslate\">__init__.py</code> file and the files to\nstore your models. You must import the models in the <code class=\"docutils literal notranslate\">__init__.py</code> file.</p>\n<p>For example, if you had <code class=\"docutils literal notranslate\">organic.py</code> and <code class=\"docutils literal notranslate\">synthetic.py</code> in the <code class=\"docutils literal notranslate\">models</code>\ndirectory:</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=\"nn\">.organic</span> <span class=\"kn\">import</span> Person\n<span class=\"kn\">from</span> <span class=\"nn\">.synthetic</span> <span class=\"kn\">import</span> Robot\n</code></pre></figure>\n<p>Explicitly importing each model rather than using <code class=\"docutils literal notranslate\">from .models import *</code>\nhas the advantages of not cluttering the namespace, making code more readable,\nand keeping code analysis tools useful.</p>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">参考</p>\n<dl class=\"simple\">\n<dt><a class=\"reference internal\" href=\"/ja/1.10/ref/models/\"><span class=\"doc\">The Models Reference</span></a></dt><dd><p>Covers all the model related APIs including model fields, related\nobjects, and <code class=\"docutils literal notranslate\">QuerySet</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":"Automatic primary key fields","anchor":"automatic-primary-key-fields","children":[]},{"title":"Verbose field names","anchor":"verbose-field-names","children":[]},{"title":"Relationships","anchor":"relationships","children":[{"title":"Many-to-one relationships","anchor":"many-to-one-relationships","children":[]},{"title":"Many-to-many relationships","anchor":"many-to-many-relationships","children":[]},{"title":"Extra fields on many-to-many relationships","anchor":"extra-fields-on-many-to-many-relationships","children":[]},{"title":"One-to-one relationships","anchor":"one-to-one-relationships","children":[]}]},{"title":"Models across files","anchor":"models-across-files","children":[]},{"title":"Field name restrictions","anchor":"field-name-restrictions","children":[]},{"title":"Custom field types","anchor":"custom-field-types","children":[]}]},{"title":"Meta options","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":"Organizing models in a package","anchor":"organizing-models-in-a-package","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/1.10/topics/"},{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/1.10/topics/db/"}],"prev":{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/1.10/topics/db/"},"next":{"docname":"topics/db/queries","title":"Making queries","url":"/ja/1.10/topics/db/queries/"},"formats":{"html":"/ja/1.10/topics/db/models/","markdown":"/ja/1.10/topics/db/models.md","json":"/ja/1.10/topics/db/models.json"},"source":"https://github.com/django/django/blob/stable/1.10.x/docs/topics/db/models.txt","official":"https://docs.djangoproject.com/ja/1.10/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","fr","ja","id","pt-br","es","el","pl"]}