{"title":"多対多 (many-to-many) 関係","version":"5.1","locale":"ja","docname":"topics/db/examples/many_to_many","url":"/ja/5.1/topics/db/examples/many_to_many/","canonical":"https://djangodocs.dev/ja/5.1/topics/db/examples/many_to_many/","summary":"多対多の関係を定義するには、ManyToManyField を使用します。","html":"<h1>多対多 (many-to-many) 関係<a class=\"heading-anchor\" href=\"#many-to-many-relationships\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>多対多の関係を定義するには、<a class=\"reference internal\" href=\"/ja/5.1/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<p>この例では、一つの <code class=\"docutils literal notranslate\">Article</code> は複数の <code class=\"docutils literal notranslate\">Publication</code> オブジェクトに掲載することができ、一つの <code class=\"docutils literal notranslate\">Publication</code> は複数の <code class=\"docutils literal notranslate\">Article</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><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\">Publication</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    title <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\">Meta</span><span class=\"p\">:</span>\n        ordering <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</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>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>title\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    publications <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Publication<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;headline&quot;</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>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>headline\n</code></pre></div>\n<p>以下は、Python API の機能を使って実行できる操作の例です。</p>\n<p>いくつかの <code class=\"docutils literal notranslate\">出版物</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>p1 <span class=\"o\">=</span> Publication<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;The Python Journal&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p1<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p2 <span class=\"o\">=</span> Publication<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Science News&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p2<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p3 <span class=\"o\">=</span> Publication<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Science Weekly&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p3<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>一つの <code class=\"docutils literal notranslate\">Article</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>a1 <span class=\"o\">=</span> Article<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;Django lets you build web apps easily&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>保存されるまでは <code class=\"docutils literal notranslate\">Publication</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>a1<span class=\"o\">.</span>publications<span class=\"o\">.</span>add<span class=\"p\">(</span>p1<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>: &quot;&lt;Article: Django lets you build web apps easily&gt;&quot; needs to have a value for field &quot;id&quot; before this many-to-many relationship can be used.\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>a1<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Article</code> と <code class=\"docutils literal notranslate\">Publication</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>a1<span class=\"o\">.</span>publications<span class=\"o\">.</span>add<span class=\"p\">(</span>p1<span class=\"p\">)</span>\n</code></pre></div>\n<p>別の <code class=\"docutils literal notranslate\">Article</code> を作成し、それを <code class=\"docutils literal notranslate\">Publications</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>a2 <span class=\"o\">=</span> Article<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;NASA uses Python&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a2<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a2<span class=\"o\">.</span>publications<span class=\"o\">.</span>add<span class=\"p\">(</span>p1<span class=\"p\">,</span> p2<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a2<span class=\"o\">.</span>publications<span class=\"o\">.</span>add<span class=\"p\">(</span>p3<span class=\"p\">)</span>\n</code></pre></div>\n<p>2回の追加はOKで、関係が重複することはありません:</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>a2<span class=\"o\">.</span>publications<span class=\"o\">.</span>add<span class=\"p\">(</span>p3<span class=\"p\">)</span>\n</code></pre></div>\n<p>間違った型のオブジェクトを追加すると <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#TypeError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\">TypeError</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>a2<span class=\"o\">.</span>publications<span class=\"o\">.</span>add<span class=\"p\">(</span>a1<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;Publication&#39; instance expected\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Article</code> に <code class=\"docutils literal notranslate\">Publication</code> をワンステップで作成・追加するには <a class=\"reference internal\" href=\"/ja/5.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.create\" title=\"django.db.models.fields.related.RelatedManager.create\"><code class=\"xref py py-meth docutils literal notranslate\">create()</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>new_publication <span class=\"o\">=</span> a2<span class=\"o\">.</span>publications<span class=\"o\">.</span>create<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Highlights for Children&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Article</code> オブジェクトはリレーション先の <code class=\"docutils literal notranslate\">Publication</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>a1<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: The Python Journal&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a2<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: Highlights for Children&gt;, &lt;Publication: Science News&gt;, &lt;Publication: Science Weekly&gt;, &lt;Publication: The Python Journal&gt;]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Publication</code> オブジェクトはリレーション先の <code class=\"docutils literal notranslate\">Article</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>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: NASA uses Python&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p1<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Django lets you build web apps easily&gt;, &lt;Article: NASA uses Python&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<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\">4</span><span class=\"p\">)</span><span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: NASA uses Python&gt;]&gt;</span>\n</code></pre></div>\n<p>多対多の関係は <a class=\"reference internal\" href=\"/ja/5.1/topics/db/queries/#lookups-that-span-relationships\"><span class=\"std std-ref\">リレーションを横断するルックアップ</span></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>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>publications__id<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Django lets you build web apps easily&gt;, &lt;Article: NASA uses Python&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>publications__pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Django lets you build web apps easily&gt;, &lt;Article: NASA uses Python&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>publications<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Django lets you build web apps easily&gt;, &lt;Article: NASA uses Python&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>publications<span class=\"o\">=</span>p1<span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Django lets you build web apps easily&gt;, &lt;Article: NASA uses Python&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>publications__title__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Science&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: NASA uses Python&gt;, &lt;Article: NASA uses Python&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>publications__title__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Science&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: NASA uses Python&gt;]&gt;</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/5.1/ref/models/querysets/#django.db.models.query.QuerySet.count\" title=\"django.db.models.query.QuerySet.count\"><code class=\"xref py py-meth docutils literal notranslate\">count()</code></a> 関数は <a class=\"reference internal\" href=\"/ja/5.1/ref/models/querysets/#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\">distinct()</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>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>publications__title__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Science&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">2</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>publications__title__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Science&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\n<span class=\"gp\">&gt;&gt;&gt; </span>Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>publications__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: Django lets you build web apps easily&gt;, &lt;Article: NASA uses Python&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>publications__in<span class=\"o\">=</span><span class=\"p\">[</span>p1<span class=\"p\">,</span> p2<span class=\"p\">])</span><span class=\"o\">.</span>distinct<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Django lets you build web apps easily&gt;, &lt;Article: NASA uses Python&gt;]&gt;</span>\n</code></pre></div>\n<p>逆の多対多クエリもサポートされています (つまり、 <a class=\"reference internal\" href=\"/ja/5.1/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=\"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>Publication<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: The Python Journal&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: The Python Journal&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<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;NASA&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: Highlights for Children&gt;, &lt;Publication: Science News&gt;, &lt;Publication: Science Weekly&gt;, &lt;Publication: The Python Journal&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__id<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: The Python Journal&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<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;Publication: The Python Journal&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<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;Publication: The Python Journal&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article<span class=\"o\">=</span>a1<span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: The Python Journal&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__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;Publication: Highlights for Children&gt;, &lt;Publication: Science News&gt;, &lt;Publication: Science Weekly&gt;, &lt;Publication: The Python Journal&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>article__in<span class=\"o\">=</span><span class=\"p\">[</span>a1<span class=\"p\">,</span> a2<span class=\"p\">])</span><span class=\"o\">.</span>distinct<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: Highlights for Children&gt;, &lt;Publication: Science News&gt;, &lt;Publication: Science Weekly&gt;, &lt;Publication: The Python Journal&gt;]&gt;</span>\n</code></pre></div>\n<p>リレーション先のアイテムの除外も期待通りに動作します（SQLは少し複雑ですが）:</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>exclude<span class=\"p\">(</span>publications<span class=\"o\">=</span>p2<span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Django lets you build web apps easily&gt;]&gt;</span>\n</code></pre></div>\n<p>もし <code class=\"docutils literal notranslate\">Publication</code> を削除すると、その <code class=\"docutils literal notranslate\">Articles</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>p1<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: Highlights for Children&gt;, &lt;Publication: Science News&gt;, &lt;Publication: Science Weekly&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a1 <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a1<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n</code></pre></div>\n<p>もし <code class=\"docutils literal notranslate\">Article</code> を削除すると、その <code class=\"docutils literal notranslate\">Publications</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>a2<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: Django lets you build web apps easily&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n</code></pre></div>\n<p>多対多のリレーションシップの「反対側の」端を経由した追加:</p>\n<div class=\"code-block\" data-language=\"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>a4 <span class=\"o\">=</span> Article<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;NASA finds intelligent life on Earth&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a4<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>add<span class=\"p\">(</span>a4<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: NASA finds intelligent life on Earth&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a4<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: Science News&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>new_article <span class=\"o\">=</span> p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>create<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;Oxygen-free diet works wonders&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: NASA finds intelligent life on Earth&gt;, &lt;Article: Oxygen-free diet works wonders&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a5 <span class=\"o\">=</span> p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a5<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: Science News&gt;]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Article</code> から <code class=\"docutils literal notranslate\">Publication</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>a4<span class=\"o\">.</span>publications<span class=\"o\">.</span>remove<span class=\"p\">(</span>p2<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Oxygen-free diet works wonders&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a4<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n</code></pre></div>\n<p>反対側からも:</p>\n<div class=\"code-block\" data-language=\"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>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>remove<span class=\"p\">(</span>a5<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p2<span class=\"o\">.</span>article_set<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>a5<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n</code></pre></div>\n<p>リレーションのセットも指定できます:</p>\n<div class=\"code-block\" data-language=\"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>a4<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: Science News&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a4<span class=\"o\">.</span>publications<span class=\"o\">.</span>set<span class=\"p\">([</span>p3<span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a4<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: Science Weekly&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>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>clear<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n</code></pre></div>\n<p>反対側からも削除できます:</p>\n<div class=\"code-block\" data-language=\"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>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>add<span class=\"p\">(</span>a4<span class=\"p\">,</span> a5<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: NASA finds intelligent life on Earth&gt;, &lt;Article: Oxygen-free diet works wonders&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a4<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: Science News&gt;, &lt;Publication: Science Weekly&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a4<span class=\"o\">.</span>publications<span class=\"o\">.</span>clear<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a4<span class=\"o\">.</span>publications<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>p2<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Oxygen-free diet works wonders&gt;]&gt;</span>\n</code></pre></div>\n<p>削除した <code class=\"docutils literal notranslate\">Article</code> と <code class=\"docutils literal notranslate\">Publication</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>p1 <span class=\"o\">=</span> Publication<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;The Python Journal&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p1<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a2 <span class=\"o\">=</span> Article<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;NASA uses Python&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a2<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a2<span class=\"o\">.</span>publications<span class=\"o\">.</span>add<span class=\"p\">(</span>p1<span class=\"p\">,</span> p2<span class=\"p\">,</span> p3<span class=\"p\">)</span>\n</code></pre></div>\n<p>複数の <code class=\"docutils literal notranslate\">Publications</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>Publication<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>title__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Science&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>delete<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Publication<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: Highlights for Children&gt;, &lt;Publication: The Python Journal&gt;]&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 [&lt;Article: Django lets you build web apps easily&gt;, &lt;Article: NASA finds intelligent life on Earth&gt;, &lt;Article: NASA uses Python&gt;, &lt;Article: Oxygen-free diet works wonders&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a2<span class=\"o\">.</span>publications<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Publication: The Python Journal&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>q <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Django&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>q<span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: Django lets you build web apps easily&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/5.1/ref/models/querysets/#django.db.models.query.QuerySet.delete\" title=\"django.db.models.query.QuerySet.delete\"><code class=\"xref py py-meth docutils literal notranslate\">delete()</code></a> の後は、 <a class=\"reference internal\" href=\"/ja/5.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</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><span class=\"nb\">print</span><span class=\"p\">(</span>q<span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p1<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Article: NASA uses Python&gt;]&gt;</span>\n</code></pre></div>","rootId":"many-to-many-relationships","toc":[],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/5.1/topics/"},{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/5.1/topics/db/"},{"docname":"topics/db/examples/index","title":"モデルリレーションシップ API の使用例","url":"/ja/5.1/topics/db/examples/"}],"prev":{"docname":"topics/db/examples/index","title":"モデルリレーションシップ API の使用例","url":"/ja/5.1/topics/db/examples/"},"next":{"docname":"topics/db/examples/many_to_one","title":"多対一 (many-to-one) 関係","url":"/ja/5.1/topics/db/examples/many_to_one/"},"formats":{"html":"/ja/5.1/topics/db/examples/many_to_many/","markdown":"/ja/5.1/topics/db/examples/many_to_many.md","json":"/ja/5.1/topics/db/examples/many_to_many.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/topics/db/examples/many_to_many.txt","official":"https://docs.djangoproject.com/ja/5.1/topics/db/examples/many_to_many/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}