{"title":"多対一 (many-to-one) 関係","version":"6.0","locale":"ja","docname":"topics/db/examples/many_to_one","url":"/ja/6.0/topics/db/examples/many_to_one/","canonical":"https://djangodocs.dev/ja/6.0/topics/db/examples/many_to_one/","summary":"多対一のリレーションシップを定義するには ForeignKey を使います。","html":"<h1>多対一 (many-to-one) 関係<a class=\"heading-anchor\" href=\"#many-to-one-relationships\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>多対一のリレーションシップを定義するには <a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> を使います。</p>\n<p>この例では、 <code class=\"docutils literal notranslate\">Reporter</code> は複数の <code class=\"docutils literal notranslate\">Article</code> オブジェクトと関連付けることができますが、 <code class=\"docutils literal notranslate\">Article</code> は一つの <code class=\"docutils literal notranslate\">Reporter</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\n<span class=\"k\">class</span> <span class=\"nc\">Reporter</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    email <span class=\"o\">=</span> models<span class=\"o\">.</span>EmailField<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>\n        <span class=\"k\">return</span> <span class=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span>first_name<span class=\"si\">}</span><span class=\"s2\"> </span><span class=\"si\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span>last_name<span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n\n\n<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    headline <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    pub_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n    reporter <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Reporter<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<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>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>headline\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;headline&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>以下は、Python API の機能を使って実行できる操作の例です。</p>\n<p>複数の Reporter を作成する:</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>r <span class=\"o\">=</span> Reporter<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Smith&quot;</span><span class=\"p\">,</span> email<span class=\"o\">=</span><span class=\"s2\">&quot;john@example.com&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>r<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>r2 <span class=\"o\">=</span> Reporter<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;Paul&quot;</span><span class=\"p\">,</span> last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Jones&quot;</span><span class=\"p\">,</span> email<span class=\"o\">=</span><span class=\"s2\">&quot;paul@example.com&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>r2<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Article を作成する:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> date\n<span class=\"gp\">&gt;&gt;&gt; </span>a <span class=\"o\">=</span> Article<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> headline<span class=\"o\">=</span><span class=\"s2\">&quot;This is a test&quot;</span><span class=\"p\">,</span> pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"mi\">27</span><span class=\"p\">),</span> reporter<span class=\"o\">=</span>r<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>a<span class=\"o\">.</span>reporter<span class=\"o\">.</span>id\n<span class=\"go\">1</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>a<span class=\"o\">.</span>reporter\n<span class=\"go\">&lt;Reporter: John Smith&gt;</span>\n</code></pre></div>\n<p>オブジェクトを外部キーリレーションシップに代入する前に保存する必要があることに注意してください。たとえば、保存されていない <code class=\"docutils literal notranslate\">Reporter</code> で <code class=\"docutils literal notranslate\">Article</code> を作成すると、次のように <code class=\"docutils literal notranslate\">ValueError</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>r3 <span class=\"o\">=</span> Reporter<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Smith&quot;</span><span class=\"p\">,</span> email<span class=\"o\">=</span><span class=\"s2\">&quot;john@example.com&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    headline<span class=\"o\">=</span><span class=\"s2\">&quot;This is a test&quot;</span><span class=\"p\">,</span> pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"mi\">27</span><span class=\"p\">),</span> reporter<span class=\"o\">=</span>r3\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">ValueError</span>: save() prohibited to prevent data loss due to unsaved related object &#39;reporter&#39;.\n</code></pre></div>\n<p>Article オブジェクトはリレーション先オブジェクトにアクセスできます:</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>r <span class=\"o\">=</span> a<span class=\"o\">.</span>reporter\n</code></pre></div>\n<p>Reporter オブジェクトを使って Article を作成する:</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>new_article <span class=\"o\">=</span> r<span class=\"o\">.</span>article_set<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    headline<span class=\"o\">=</span><span class=\"s2\">&quot;John&#39;s second story&quot;</span><span class=\"p\">,</span> pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"mi\">29</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>new_article\n<span class=\"go\">&lt;Article: John&#39;s second story&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>new_article<span class=\"o\">.</span>reporter\n<span class=\"go\">&lt;Reporter: John Smith&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>new_article<span class=\"o\">.</span>reporter<span class=\"o\">.</span>id\n<span class=\"go\">1</span>\n</code></pre></div>\n<p>新しい記事を作成する:</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>new_article2 <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    headline<span class=\"o\">=</span><span class=\"s2\">&quot;Paul&#39;s story&quot;</span><span class=\"p\">,</span> pub_date<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">2006</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">17</span><span class=\"p\">),</span> reporter<span class=\"o\">=</span>r\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>new_article2<span class=\"o\">.</span>reporter\n<span class=\"go\">&lt;Reporter: John Smith&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>new_article2<span class=\"o\">.</span>reporter<span class=\"o\">.</span>id\n<span class=\"go\">1</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>r<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: Paul&#39;s story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n</code></pre></div>\n<p>同じ記事を別の記事セットに追加する - 移動することを確認します:</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>r2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>add<span class=\"p\">(</span>new_article2<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>new_article2<span class=\"o\">.</span>reporter<span class=\"o\">.</span>id\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>new_article2<span class=\"o\">.</span>reporter\n<span class=\"go\">&lt;Reporter: Paul Jones&gt;</span>\n</code></pre></div>\n<p>間違った型のオブジェクトを追加すると TypeError が発生します:</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>r<span class=\"o\">.</span>article_set<span class=\"o\">.</span>add<span class=\"p\">(</span>r2<span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">TypeError</span>: &#39;Article&#39; instance expected, got &lt;Reporter: Paul Jones&gt;\n\n<span class=\"gp\">&gt;&gt;&gt; </span>r<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>r2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Paul&#39;s story&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>r<span class=\"o\">.</span>article_set<span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">2</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>r2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">1</span>\n</code></pre></div>\n<p>最後の例では、記事が John から Paul に移動していることに注意してください。</p>\n<p>関係マネージャはフィールドルックアップもサポートします。APIは必要な範囲まで自動的にリレーションシップをたどります。リレーションシップを区切るには2重アンダースコアを使用してください。これは、好きなだけ深くできます。制限はありません。たとえば:</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>r<span class=\"o\">.</span>article_set<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;This&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: This is a test&gt;]&gt;</span>\n\n<span class=\"go\"># Find all Articles for any Reporter whose first name is &quot;John&quot;.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>reporter__first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n</code></pre></div>\n<p>これは完全一致を意味します:</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>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>reporter__first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n</code></pre></div>\n<p>リレーション先フィールドに2回クエリをかけます。これはWHERE句のAND条件に変換されます:</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>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>reporter__first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> reporter__last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Smith&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n</code></pre></div>\n<p>リレーションのルックアップでは、主キーの値を指定するか、リレーション先オブジェクトを明示的に渡すことができます:</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>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>reporter__pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>reporter<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>reporter<span class=\"o\">=</span>r<span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>reporter__in<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">])</span><span class=\"o\">.</span>distinct<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: Paul&#39;s story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>reporter__in<span class=\"o\">=</span><span class=\"p\">[</span>r<span class=\"p\">,</span> r2<span class=\"p\">])</span><span class=\"o\">.</span>distinct<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: Paul&#39;s story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n</code></pre></div>\n<p>インスタンスのリテラルのリストの代わりにクエリセットを使用することもできます:</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>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    reporter__in<span class=\"o\">=</span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n</code></pre></div>\n<p>逆方向のクエリ:</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>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Reporter: John Smith&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Reporter: John Smith&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article<span class=\"o\">=</span>a<span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Reporter: John Smith&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__headline__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;This&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Reporter: John Smith&gt;, &lt;Reporter: John Smith&gt;, &lt;Reporter: John Smith&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__headline__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;This&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Reporter: John Smith&gt;]&gt;</span>\n</code></pre></div>\n<p>逆方向のカウントは <code class=\"docutils literal notranslate\">distinct()</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>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__headline__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;This&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">3</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__headline__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;This&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<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>クエリは循環することがあります:</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>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__reporter__first_name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Reporter: John Smith&gt;, &lt;Reporter: John Smith&gt;, &lt;Reporter: John Smith&gt;, &lt;Reporter: John Smith&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__reporter__first_name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Reporter: John Smith&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__reporter<span class=\"o\">=</span>r<span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Reporter: John Smith&gt;]&gt;</span>\n</code></pre></div>\n<p>レポーターを削除すると、そのレポーターの記事も削除されます (ForeignKeyが <a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\">django.db.models.ForeignKey.on_delete</code></a> に <code class=\"docutils literal notranslate\">CASCADE</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>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: Paul&#39;s story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Reporter: John Smith&gt;, &lt;Reporter: Paul Jones&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>r2<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: John&#39;s second story&gt;, &lt;Article: This is a test&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Reporter: John Smith&gt;]&gt;</span>\n</code></pre></div>\n<p>クエリで JOIN を使って削除することもできます:</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>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__headline__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;This&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>delete<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Article<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>","rootId":"many-to-one-relationships","toc":[],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/6.0/topics/"},{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/6.0/topics/db/"},{"docname":"topics/db/examples/index","title":"モデルリレーションシップ API の使用例","url":"/ja/6.0/topics/db/examples/"}],"prev":{"docname":"topics/db/examples/many_to_many","title":"多対多 (many-to-many) 関係","url":"/ja/6.0/topics/db/examples/many_to_many/"},"next":{"docname":"topics/db/examples/one_to_one","title":"一対一 (one-to-one) 関係","url":"/ja/6.0/topics/db/examples/one_to_one/"},"formats":{"html":"/ja/6.0/topics/db/examples/many_to_one/","markdown":"/ja/6.0/topics/db/examples/many_to_one.md","json":"/ja/6.0/topics/db/examples/many_to_one.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/db/examples/many_to_one.txt","official":"https://docs.djangoproject.com/ja/6.0/topics/db/examples/many_to_one/","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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}