{"title":"複合主キー","version":"5.2","locale":"ja","docname":"topics/composite-primary-key","url":"/ja/5.2/topics/composite-primary-key/","canonical":"https://djangodocs.dev/ja/5.2/topics/composite-primary-key/","summary":"Django では、すべてのモデルに主キーが存在します。デフォルトでは、この主キーは単一のフィールドで構成されます。ほとんどの場合、単一の主キーで十分です。","html":"<h1>複合主キー<a class=\"heading-anchor\" href=\"#composite-primary-keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"version-note version-added\" data-version=\"5.2\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.2</p></aside>\n<p>Django では、すべてのモデルに主キーが存在します。デフォルトでは、この主キーは単一のフィールドで構成されます。</p>\n<p>ほとんどの場合、単一の主キーで十分です。しかし、データベース設計においては、複数のフィールドからなる主キーが必要になることもあります。</p>\n<p>複合主キーを使用するには、モデルを定義する際に <code class=\"docutils literal notranslate\">pk</code> 属性を <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.CompositePrimaryKey\" title=\"django.db.models.CompositePrimaryKey\"><code class=\"xref py py-class docutils literal notranslate\">CompositePrimaryKey</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\">Product</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\n\n<span class=\"k\">class</span> <span class=\"nc\">Order</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    reference <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">,</span> primary_key<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">OrderLineItem</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    pk <span class=\"o\">=</span> models<span class=\"o\">.</span>CompositePrimaryKey<span class=\"p\">(</span><span class=\"s2\">&quot;product_id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;order_id&quot;</span><span class=\"p\">)</span>\n    product <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Product<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    order <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Order<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    quantity <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n</code></pre></div>\n<p>これにより、Django はテーブル作成時に複合主キー（ <code class=\"docutils literal notranslate\">PRIMARY KEY (product_id, order_id)</code> ）を作成するようになります。</p>\n<p>複合主キーは <code class=\"docutils literal notranslate\">tuple</code> （タプル）で表現されます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>product <span class=\"o\">=</span> Product<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;apple&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>order <span class=\"o\">=</span> Order<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>reference<span class=\"o\">=</span><span class=\"s2\">&quot;A755H&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>item <span class=\"o\">=</span> OrderLineItem<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>product<span class=\"o\">=</span>product<span class=\"p\">,</span> order<span class=\"o\">=</span>order<span class=\"p\">,</span> quantity<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>item<span class=\"o\">.</span>pk\n<span class=\"go\">(1, &quot;A755H&quot;)</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/5.2/ref/models/instances/#django.db.models.Model.pk\" title=\"django.db.models.Model.pk\"><code class=\"xref py py-attr docutils literal notranslate\">pk</code></a> 属性に <code class=\"docutils literal notranslate\">tuple</code> を代入することで、対応するフィールドの値をまとめて設定できます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>item <span class=\"o\">=</span> OrderLineItem<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s2\">&quot;B142C&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>item<span class=\"o\">.</span>pk\n<span class=\"go\">(2, &quot;B142C&quot;)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>item<span class=\"o\">.</span>product_id\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>item<span class=\"o\">.</span>order_id\n<span class=\"go\">&quot;B142C&quot;</span>\n</code></pre></div>\n<p>複合主キーは、 <code class=\"docutils literal notranslate\">tuple</code> を使ってフィルタリングできます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>OrderLineItem<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s2\">&quot;A755H&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">1</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#cpk-and-relations\"><span class=\"std std-ref\">リレーションシップフィールド</span></a> (<a class=\"reference internal\" href=\"/ja/5.2/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">GenericForeignKey</code></a> を含む) や Django 管理サイトにおける複合主キーのサポートは、現在も開発中です。現時点では、複合主キーを持つモデルは Django の管理サイトに登録できません。将来のリリースで対応が追加される予定です。</p>\n<section id=\"migrating-to-a-composite-primary-key\">\n<h2>複合主キーへの移行<a class=\"heading-anchor\" href=\"#migrating-to-a-composite-primary-key\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django は、テーブル作成後に複合主キーへマイグレーションしたり、それを元に戻したりする操作をサポートしていません。また、複合主キーにフィールドを追加・削除することもサポートされていません。</p>\n<p>既存のテーブルを単一の主キーから複合主キーに移行したい場合は、利用中のデータベースバックエンドの手順にしたがって操作してください。</p>\n<p>複合主キーを設定できたら、モデルに <code class=\"docutils literal notranslate\">CompositePrimaryKey</code> フィールドを追加してください。これにより、Django はその複合主キーを正しく認識し、適切に扱えるようになります。</p>\n<p>主キーフィールドに対するマイグレーション操作（たとえば <code class=\"docutils literal notranslate\">AddField</code> や <code class=\"docutils literal notranslate\">AlterField</code> ）はサポートされていませんが、 <code class=\"docutils literal notranslate\">makemigrations</code> は変更を検出します。</p>\n<p>エラーを避けるために、上記のようなマイグレーションは <code class=\"docutils literal notranslate\">--fake</code> オプションを付けて適用することを推奨します。</p>\n<p>代わりに、 <a class=\"reference internal\" href=\"/ja/5.2/ref/migration-operations/#django.db.migrations.operations.SeparateDatabaseAndState\" title=\"django.db.migrations.operations.SeparateDatabaseAndState\"><code class=\"xref py py-class docutils literal notranslate\">SeparateDatabaseAndState</code></a> を使うことで、データベース固有のマイグレーションと Django による状態管理用マイグレーションを、1つの操作としてまとめて実行することもできます。</p>\n</section>\n<section id=\"composite-primary-keys-and-relations\">\n<span id=\"cpk-and-relations\"></span><h2>複合主キーとリレーション<a class=\"heading-anchor\" href=\"#composite-primary-keys-and-relations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#relationship-fields\"><span class=\"std std-ref\">リレーションシップフィールド</span></a> (<a class=\"reference internal\" href=\"/ja/5.2/ref/contrib/contenttypes/#generic-relations\"><span class=\"std std-ref\">ジェネリックリレーション</span></a> を含む) は、複合主キーをサポートしていません。</p>\n<p>たとえば先ほどの <code class=\"docutils literal notranslate\">OrderLineItem</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\">Foo</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    item <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>OrderLineItem<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n</code></pre></div>\n<p>これは、現在 <code class=\"docutils literal notranslate\">ForeignKey</code> が複合主キーを持つモデルを参照できないためです。</p>\n<p>この制限を回避するには、代わりに <code class=\"docutils literal notranslate\">ForeignObject</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\">Foo</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    item_order_id <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    item_product_id <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n    item <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignObject<span class=\"p\">(</span>\n        OrderLineItem<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        from_fields<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;item_order_id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;item_product_id&quot;</span><span class=\"p\">),</span>\n        to_fields<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;order_id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;product_id&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">ForeignObject</code> は <code class=\"docutils literal notranslate\">ForeignKey</code> によく似ていますが、データベース上にカラム (例: <code class=\"docutils literal notranslate\">item_id</code>)、外部キー制約、インデックスなどを作成しない点、 <code class=\"docutils literal notranslate\">on_delete</code> 引数が無視される点が異なります。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><code class=\"docutils literal notranslate\">ForeignObject</code> は内部 API です。つまり、 <a class=\"reference internal\" href=\"/ja/5.2/internals/release-process/#internal-release-deprecation-policy\"><span class=\"std std-ref\">非推奨ポリシー</span></a> の対象外です。</p>\n</aside>\n</section>\n<section id=\"composite-primary-keys-and-database-functions\">\n<span id=\"cpk-and-database-functions\"></span><h2>複合主キーとデータベース関数<a class=\"heading-anchor\" href=\"#composite-primary-keys-and-database-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>多くのデータベース関数は、単一の式しか受け付けません。</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\">MAX</span><span class=\"p\">(</span><span class=\"ss\">&quot;order_id&quot;</span><span class=\"p\">)</span>  <span class=\"c1\">-- OK</span>\n<span class=\"k\">MAX</span><span class=\"p\">(</span><span class=\"ss\">&quot;product_id&quot;</span><span class=\"p\">,</span> <span class=\"ss\">&quot;order_id&quot;</span><span class=\"p\">)</span>  <span class=\"c1\">-- ERROR</span>\n</code></pre></div>\n<p>複合主キーは複数のカラム表現を含むため、このような関数に渡すと、 <code class=\"docutils literal notranslate\">ValueError</code> が発生します。 ただし <code class=\"docutils literal notranslate\">Count</code> だけは例外で、複合主キーでも利用できます。</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code>Max<span class=\"p\">(</span><span class=\"s2\">&quot;order_id&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># OK</span>\nMax<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># ValueError</span>\nCount<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># OK</span>\n</code></pre></div>\n</section>\n<section id=\"composite-primary-keys-in-forms\">\n<h2>フォーム内での複合主キー<a class=\"heading-anchor\" href=\"#composite-primary-keys-in-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>複合主キーは仮想フィールドであり、単一のデータベースカラムを表さないため、ModelForm には含まれません。</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=\"k\">class</span> <span class=\"nc\">OrderLineItemForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> OrderLineItem\n        fields <span class=\"o\">=</span> <span class=\"s2\">&quot;__all__&quot;</span>\n</code></pre></div>\n<p>このフォームには、複合主キーのための <code class=\"docutils literal notranslate\">pk</code> フィールドは含まれません：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>OrderLineItemForm<span class=\"p\">()</span>\n<span class=\"go\">&lt;OrderLineItemForm bound=False, valid=Unknown, fields=(product;order;quantity)&gt;</span>\n</code></pre></div>\n<p>複合主キーである <code class=\"docutils literal notranslate\">pk</code> をフォームフィールドとして指定しようとすると、存在しないフィールドとして <a class=\"reference internal\" href=\"/ja/5.2/ref/exceptions/#django.core.exceptions.FieldError\" title=\"django.core.exceptions.FieldError\"><code class=\"xref py py-exc docutils literal notranslate\">FieldError</code></a> が発生します。</p>\n<aside class=\"admonition-primary-key-fields-are-read-only admonition\" role=\"note\">\n<p class=\"admonition-title\">主キーフィールドは読み取り専用です</p>\n<p>既存のオブジェクトで主キーの値を変更してから保存すると、新しいオブジェクトが元のオブジェクトとは別に作成されます (<a class=\"reference internal\" href=\"/ja/5.2/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> を参照)。</p>\n<p>これは複合主キーの場合も同様です。そのため、すべての主キーフィールドに対して <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\">Field.editable</code></a> を <code class=\"docutils literal notranslate\">False</code> に設定し、ModelForm から除外することを検討してください。</p>\n</aside>\n</section>\n<section id=\"composite-primary-keys-in-model-validation\">\n<h2>モデルバリデーションと複合主キー<a class=\"heading-anchor\" href=\"#composite-primary-keys-in-model-validation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\">pk</code> は仮想フィールドなので、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/instances/#django.db.models.Model.clean_fields\" title=\"django.db.models.Model.clean_fields\"><code class=\"xref py py-meth docutils literal notranslate\">Model.clean_fields()</code></a> の <code class=\"docutils literal notranslate\">exclude</code> 引数に <code class=\"docutils literal notranslate\">pk</code> を指定しても効果はありません。複合主キーの各フィールドをバリデーションから除外したい場合は、それぞれのフィールド名を個別に指定してください。一方、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/instances/#django.db.models.Model.validate_unique\" title=\"django.db.models.Model.validate_unique\"><code class=\"xref py py-meth docutils literal notranslate\">Model.validate_unique()</code></a> に対しては <code class=\"docutils literal notranslate\">exclude={&quot;pk&quot;}</code> を指定することで、一意性のチェックをスキップできます。</p>\n</section>\n<section id=\"building-composite-primary-key-ready-applications\">\n<h2>複合主キーに対応したアプリケーションをつくる<a class=\"heading-anchor\" href=\"#building-composite-primary-key-ready-applications\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>複合主キーが導入される前は、モデルの主キーとなる単一フィールドを見つけたいとき、各フィールドの <a class=\"reference internal\" href=\"/ja/5.2/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> 属性を確認するだけで済みました：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>pk_field <span class=\"o\">=</span> <span class=\"kc\">None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> field <span class=\"ow\">in</span> Product<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">():</span>\n<span class=\"gp\">... </span>    <span class=\"k\">if</span> field<span class=\"o\">.</span>primary_key<span class=\"p\">:</span>\n<span class=\"gp\">... </span>        pk_field <span class=\"o\">=</span> field\n<span class=\"gp\">... </span>        <span class=\"k\">break</span>\n<span class=\"gp\">...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pk_field\n<span class=\"go\">&lt;django.db.models.fields.AutoField: id&gt;</span>\n</code></pre></div>\n<p>しかし <a class=\"reference internal\" href=\"/ja/5.2/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> 属性はひとつのモデルにつき最大ひとつのフィールドしか <code class=\"docutils literal notranslate\">True</code> を取れないという制約があるため、複合主キーのもとではすべて <code class=\"docutils literal notranslate\">False</code> になってしまい、これでは主キーを構成するフィールドを特定するためには使えません。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>pk_fields <span class=\"o\">=</span> <span class=\"p\">[]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> field <span class=\"ow\">in</span> OrderLineItem<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">():</span>\n<span class=\"gp\">... </span>    <span class=\"k\">if</span> field<span class=\"o\">.</span>primary_key<span class=\"p\">:</span>\n<span class=\"gp\">... </span>        pk_fields<span class=\"o\">.</span>append<span class=\"p\">(</span>field<span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pk_fields\n<span class=\"go\">[]</span>\n</code></pre></div>\n<p>複合主キーに正しく対応するコードを書くためには、代わりに <a class=\"reference internal\" href=\"/ja/5.2/ref/models/meta/#django.db.models.options.Options.pk_fields\" title=\"django.db.models.options.Options.pk_fields\"><code class=\"xref py py-attr docutils literal notranslate\">_meta.pk_fields</code></a> 属性を使用してください：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Product<span class=\"o\">.</span>_meta<span class=\"o\">.</span>pk_fields\n<span class=\"go\">[&lt;django.db.models.fields.AutoField: id&gt;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>OrderLineItem<span class=\"o\">.</span>_meta<span class=\"o\">.</span>pk_fields\n<span class=\"go\">[</span>\n<span class=\"go\">    &lt;django.db.models.fields.ForeignKey: product&gt;,</span>\n<span class=\"go\">    &lt;django.db.models.fields.ForeignKey: order&gt;</span>\n<span class=\"go\">]</span>\n</code></pre></div>\n</section>","rootId":"composite-primary-keys","toc":[{"title":"複合主キーへの移行","anchor":"migrating-to-a-composite-primary-key","children":[]},{"title":"複合主キーとリレーション","anchor":"composite-primary-keys-and-relations","children":[]},{"title":"複合主キーとデータベース関数","anchor":"composite-primary-keys-and-database-functions","children":[]},{"title":"フォーム内での複合主キー","anchor":"composite-primary-keys-in-forms","children":[]},{"title":"モデルバリデーションと複合主キー","anchor":"composite-primary-keys-in-model-validation","children":[]},{"title":"複合主キーに対応したアプリケーションをつくる","anchor":"building-composite-primary-key-ready-applications","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/5.2/topics/"}],"prev":{"docname":"topics/conditional-view-processing","title":"条件付きのビュー処理","url":"/ja/5.2/topics/conditional-view-processing/"},"next":{"docname":"topics/signing","title":"暗号署名","url":"/ja/5.2/topics/signing/"},"formats":{"html":"/ja/5.2/topics/composite-primary-key/","markdown":"/ja/5.2/topics/composite-primary-key.md","json":"/ja/5.2/topics/composite-primary-key.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/composite-primary-key.txt","official":"https://docs.djangoproject.com/ja/5.2/topics/composite-primary-key/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}