{"title":"マネージャ","version":"5.2","locale":"ja","docname":"topics/db/managers","url":"/ja/5.2/topics/db/managers/","canonical":"https://djangodocs.dev/ja/5.2/topics/db/managers/","summary":"class Manager Link to this definition # マネージャ (Manager) とは、Django のモデルに対するデータベースクエリの操作を提供するインターフェイスです。Django アプリケーション内の1つのモデルに対して、 Manager は最低でも1つは存在します。 Manager…","html":"<h1>マネージャ<a class=\"heading-anchor\" href=\"#managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Manager\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Manager</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Manager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">マネージャ</span> <span class=\"pre\">(Manager)</span></code> とは、Django のモデルに対するデータベースクエリの操作を提供するインターフェイスです。Django アプリケーション内の1つのモデルに対して、<code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> は最低でも1つは存在します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> クラスの詳細については、<a class=\"reference internal\" href=\"/ja/5.2/topics/db/queries/\"><span class=\"doc\">クエリを作成する</span></a> に書かれています。ここでは、特に、<code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> の動作をカスタマイズするモデルのオプションについて説明しています。</p>\n<section id=\"manager-names\">\n<span id=\"id1\"></span><h2>マネージャの名前<a class=\"heading-anchor\" href=\"#manager-names\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>デフォルトでは、Django は <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> という名前の <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> を各 Django モデルクラスに対して追加します。しかし、もし <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> をフィールド名として使いたい場合や、あるいは、<code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> に対して <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> 以外の名前を使いたい場合には、各モデル単位で好きな名前を付けることができます。あるクラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> の名前を変えるには、そのクラスの上で <code class=\"docutils literal notranslate\"><span class=\"pre\">models.Manager()</span></code> と書いて、クラス変数を定義します。たとえば、次のように書きます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>このモデル例を使うと、<code class=\"docutils literal notranslate\"><span class=\"pre\">Person.objects</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">AttributeError</span></code> 例外を起こしますが、<code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people.all()</span></code> と書けば、すべての <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> オブジェクトのリストが得られます。</p>\n</section>\n<section id=\"custom-managers\">\n<span id=\"id2\"></span><h2>マネージャのカスタマイズ<a class=\"heading-anchor\" href=\"#custom-managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> ベースクラスを拡張し、カスタマイズした <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> をモデル内でインスタンス化すれば、特定のモデル用にカスタマイズした <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> を使うことができます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> をカスタマイズしたくなるシチュエーションとしては、たとえば次の2つのような場合が考えられます。1つ目は、<code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> に新しいメソッドを追加したい場合、もう1つは、<code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> が最初に返す <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> を修正したい場合です。</p>\n<section id=\"adding-extra-manager-methods\">\n<h3>マネージャに新しいメソッドを追加する<a class=\"heading-anchor\" href=\"#adding-extra-manager-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> に新しいメソッドを追加するのがふさわしいのは、モデルに対する「テーブルレベル」での操作を追加したい場合です。(「低レベル」の機能、たとえば、あるモデルオブジェクトの1つのインスタンスに作用するような関数の場合には、<code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> をカスタマイズするのではなく、<a class=\"reference internal\" href=\"/ja/5.2/topics/db/models/#model-methods\"><span class=\"std std-ref\">モデルメソッド</span></a> を使ってください。</p>\n<p>たとえば、このカスタム <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">with_counts()</span></code> メソッドを追加します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Coalesce</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PollManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">with_counts</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">num_responses</span><span class=\"o\">=</span><span class=\"n\">Coalesce</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;response&quot;</span><span class=\"p\">),</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">OpinionPoll</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">question</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">PollManager</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Response</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">poll</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">OpinionPoll</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<p>この例では、 <code class=\"docutils literal notranslate\"><span class=\"pre\">OpinionPoll.objects.with_counts()</span></code> を使うことで、 <code class=\"docutils literal notranslate\"><span class=\"pre\">num_responses</span></code> 属性が付加された <code class=\"docutils literal notranslate\"><span class=\"pre\">OpinionPoll</span></code> オブジェクトの <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> を得ることができます。</p>\n<p>カスタムの <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> のメソッドは、どんなオブジェクトを返しても構いません。<code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> である必要はありません。</p>\n<p>注目すべきもう1つの点は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> 内のメソッドではself.modelとすることで、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> に紐づいているモデルクラスを取得できることです。</p>\n</section>\n<section id=\"modifying-a-manager-s-initial-queryset\">\n<h3>マネージャが初めに返す <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> を修正する<a class=\"heading-anchor\" href=\"#modifying-a-manager-s-initial-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> のベース <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> は、すべてのオブジェクトを返します。 たとえば、このモデルの例では...:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.all()</span></code> は、データベース内の全ての本を返します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Manager.get_queryset()</span></code> メソッドをオーバーライドすることで、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> のベース <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> を上書きできます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> は、必要な属性を含む <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> を返す必要があります。</p>\n<p>例えば、次のモデルには <em>2つ</em> の <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> があります。片方はすべてのオブジェクトを返し、もう片方はRoald Dahlの本のみを返します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># First, define the Manager subclass.</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">DahlBookManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">author</span><span class=\"o\">=</span><span class=\"s2\">&quot;Roald Dahl&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"c1\"># Then hook it into the Book model explicitly.</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>  <span class=\"c1\"># The default manager.</span>\n    <span class=\"n\">dahl_objects</span> <span class=\"o\">=</span> <span class=\"n\">DahlBookManager</span><span class=\"p\">()</span>  <span class=\"c1\"># The Dahl-specific manager.</span>\n</code></pre></div>\n<p>このモデルの例では、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.all()</span></code> はデータベース上の本を全て返 しますが、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.dahl_objects.all()</span></code> は Roald Dahl の書いた本だけを返しま す。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> オブジェクトを返すので、 <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> 、その他の <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> オブジェクトのメソッドを全て使えます。したがって、以下のような文も実行できます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">dahl_objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">dahl_objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Matilda&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">dahl_objects</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>この例では、同じモデルで複数のマネージャを使用するという、追加の面白いテクニックも紹介しました。一つのモデルに対して、好きなだけ <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager()</span></code> インスタンスを割り当てることができます。これは、何度も同じコードを書かずにモデルに共通の &quot;フィルタ&quot; を定義するための方法です。</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=\"w\"> </span><span class=\"nc\">AuthorManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">EditorManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s2\">&quot;E&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">role</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Author&quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;E&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Editor&quot;</span><span class=\"p\">)})</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>\n    <span class=\"n\">authors</span> <span class=\"o\">=</span> <span class=\"n\">AuthorManager</span><span class=\"p\">()</span>\n    <span class=\"n\">editors</span> <span class=\"o\">=</span> <span class=\"n\">EditorManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>この例では、<code class=\"docutils literal notranslate\"><span class=\"pre\">Person.authors.all()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">Person.editors.all()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people.all()</span></code> を指定でき、期待通りの結果が得られます。</p>\n</section>\n<section id=\"default-managers\">\n<span id=\"id3\"></span><h3>デフォルトマネージャ<a class=\"heading-anchor\" href=\"#default-managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model._default_manager\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">_default_manager</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Model._default_manager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>カスタムの <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> オブジェクトを使う場合、 Django が (モデル内で定義された順番で) 最初に見つけた <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> には特別なステータスがあることに注意してください。Django はクラスで定義された最初の <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> を「デフォルト」の <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> と解釈し、Django の一部の機能 (<a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dumpdata</span></code></a> を含む) はそのモデル専用にその <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> を使用します。その結果、<code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> をオーバーライドした結果、利用したいオブジェクトを取得できなくなるという事態を避けるために、デフォルトマネージャの選択には注意した方が良いでしょう。</p>\n<p>カスタムのデフォルトマネージャは <a class=\"reference internal\" href=\"/ja/5.2/ref/models/options/#django.db.models.Options.default_manager_name\" title=\"django.db.models.Options.default_manager_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.default_manager_name</span></code></a> で指定できます。</p>\n<p>たとえば、ジェネリックビューを実装しているサードパーティのアプリで、未知のモデルを扱わなければならないコードを書いている場合、モデルが <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> マネージャを持っていると仮定するのではなく、このマネージャ (または <a class=\"reference internal\" href=\"#django.db.models.Model._base_manager\" title=\"django.db.models.Model._base_manager\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">_base_manager</span></code></a>) を使用してください。</p>\n</section>\n<section id=\"base-managers\">\n<h3>ベースマネージャ<a class=\"heading-anchor\" href=\"#base-managers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model._base_manager\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">_base_manager</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Model._base_manager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<section id=\"using-managers-for-related-object-access\">\n<span id=\"managers-for-related-objects\"></span><h4>マネージャによるリレーション先オブジェクトへのアクセス<a class=\"heading-anchor\" href=\"#using-managers-for-related-object-access\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>デフォルトでは、Django はリレーション先オブジェクト (例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">choice.question</span></code>) にアクセスする際に、リレーション先オブジェクトの <code class=\"docutils literal notranslate\"><span class=\"pre\">_default_manager</span></code> ではなく、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Model._base_manager</span></code> マネージャクラスのインスタンスを使います。これは Django がリレーション先オブジェクトを取得できるようにする必要があるためで、そうしないとデフォルトマネージャでフィルタリングされてしまう (つまりアクセスできない) からです。</p>\n<p>通常のベースマネージャクラス (<a class=\"reference internal\" href=\"#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.Manager</span></code></a>) があなたの環境に合わない場合、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/options/#django.db.models.Options.base_manager_name\" title=\"django.db.models.Options.base_manager_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.base_manager_name</span></code></a> を設定することで、 Django にどのクラスを使うかを指示できます。</p>\n<p>ベースマネージャはリレーション先モデルのクエリや、<a class=\"reference internal\" href=\"/ja/5.2/topics/db/queries/#backwards-related-objects\"><span class=\"std std-ref\">1対多や多対多のリレーションシップ</span></a> にアクセスする場合には使用されません。たとえば、 <a class=\"reference internal\" href=\"/ja/5.2/intro/tutorial02/#creating-models\"><span class=\"std std-ref\">チュートリアルの</span></a> <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> モデルに <code class=\"docutils literal notranslate\"><span class=\"pre\">deleted</span></code> フィールドがあり、 <code class=\"docutils literal notranslate\"><span class=\"pre\">deleted=True</span></code> のインスタンスをフィルタリングするベースマネージャがあった場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">Choice.objects.filter(question__name__startswith='What')</span></code> のようなクエリセットには削除された質問に関連する選択肢が含まれます。</p>\n</section>\n<section id=\"don-t-filter-away-any-results-in-this-type-of-manager-subclass\">\n<h4>このタイプのマネージャのサブクラスでは、結果をフィルタリングしないでください。<a class=\"heading-anchor\" href=\"#don-t-filter-away-any-results-in-this-type-of-manager-subclass\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>このマネージャは、他のモデルからリレーション先オブジェクトにアクセスするために 使用されます。このような状況では、 Django は、参照されるオブジェクトを <em>すべて</em> 取得できるように、取得するモデルのすべてのオブジェクトを見ることができなければなりません。</p>\n<p>したがって、 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> をオーバーライドして行をフィルタリングしてはいけません。もしそうすれば、 Django は不完全な結果を返します。</p>\n</section>\n</section>\n<section id=\"calling-custom-queryset-methods-from-the-manager\">\n<span id=\"calling-custom-queryset-methods-from-manager\"></span><h3>カスタマイズした <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> のメソッド をマネージャから呼び出す<a class=\"heading-anchor\" href=\"#calling-custom-queryset-methods-from-the-manager\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>標準の <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> のほとんどのメソッドは <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> から直接アクセスできますが、カスタムの <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> で定義したメソッドは <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> でも実装する必要があります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PersonQuerySet</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">QuerySet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">authors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">editors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">role</span><span class=\"o\">=</span><span class=\"s2\">&quot;E&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PersonManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">PersonQuerySet</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">using</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_db</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">authors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">authors</span><span class=\"p\">()</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">editors</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">editors</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">role</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Author&quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;E&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Editor&quot;</span><span class=\"p\">)})</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">PersonManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>この例では <code class=\"docutils literal notranslate\"><span class=\"pre\">authors()</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">editors()</span></code> の両方をマネージャ <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people</span></code> から直接呼び出すことができます。</p>\n</section>\n<section id=\"creating-a-manager-with-queryset-methods\">\n<span id=\"create-manager-with-queryset-methods\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> のメソッドで、マネージャを生成する<a class=\"heading-anchor\" href=\"#creating-a-manager-with-queryset-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> の両方でメソッドを複製する必要がある上記の方法の代わりに、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.as_manager\" title=\"django.db.models.query.QuerySet.as_manager\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.as_manager()</span></code></a> を使用すると、カスタムした <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> のメソッドをコピーした <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> のインスタンスを作成できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">PersonQuerySet</span><span class=\"o\">.</span><span class=\"n\">as_manager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.as_manager\" title=\"django.db.models.query.QuerySet.as_manager\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.as_manager()</span></code></a> によって生成される <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> インスタンスは、前の例の <code class=\"docutils literal notranslate\"><span class=\"pre\">PersonManager</span></code> とほぼ同じになります。</p>\n<p>すべての <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> メソッドが <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> レベルで意味を持つわけではありません。例えば、 <a class=\"reference internal\" href=\"/ja/5.2/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\"><span class=\"pre\">QuerySet.delete()</span></code></a> メソッドが <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> クラスにコピーされることは意図的に防いであります。</p>\n<p>メソッドは以下の規則に従ってコピーされます:</p>\n<ul class=\"simple\">\n<li><p>パブリックメソッドはデフォルトでコピーされます。</p></li>\n<li><p>プライベートメソッド (アンダースコアで始まるメソッド) は、デフォルトではコピーされません。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">queryset_only</span></code> 属性が <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> に設定されているメソッドは常にコピーされます。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">queryset_only</span></code> 属性が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定されているメソッドはコピーされません。</p></li>\n</ul>\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=\"w\"> </span><span class=\"nc\">CustomQuerySet</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">QuerySet</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Available on both Manager and QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">public_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"c1\"># Available only on QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_private_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"c1\"># Available only on QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">opted_out_public_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"n\">opted_out_public_method</span><span class=\"o\">.</span><span class=\"n\">queryset_only</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"c1\"># Available on both Manager and QuerySet.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_opted_in_private_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n    <span class=\"n\">_opted_in_private_method</span><span class=\"o\">.</span><span class=\"n\">queryset_only</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n</code></pre></div>\n<section id=\"from-queryset\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">from_queryset()</span></code><a class=\"heading-anchor\" href=\"#from-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.from_queryset\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">from_queryset</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">queryset_class</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.from_queryset\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>高度な使い方をする場合には、カスタムの <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> とカスタムの <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> の両方が必要になるかもしれません。この場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager.from_queryset()</span></code> を呼び出すことで、カスタム <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> メソッドをコピーしたベース <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> の <em>サブクラス</em> を返すことができます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manager_only_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomQuerySet</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">QuerySet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manager_and_queryset_method</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">CustomManager</span><span class=\"o\">.</span><span class=\"n\">from_queryset</span><span class=\"p\">(</span><span class=\"n\">CustomQuerySet</span><span class=\"p\">)()</span>\n</code></pre></div>\n<p>生成されたクラスを変数に格納することもできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MyManager</span> <span class=\"o\">=</span> <span class=\"n\">CustomManager</span><span class=\"o\">.</span><span class=\"n\">from_queryset</span><span class=\"p\">(</span><span class=\"n\">CustomQuerySet</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">MyManager</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"custom-managers-and-model-inheritance\">\n<span id=\"custom-managers-and-inheritance\"></span><h3>カスタムマネージャとモデルの継承<a class=\"heading-anchor\" href=\"#custom-managers-and-model-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django がカスタムマネージャと <a class=\"reference internal\" href=\"/ja/5.2/topics/db/models/#model-inheritance\"><span class=\"std std-ref\">モデルの継承</span></a> をどのように扱うかを以下に示します:</p>\n<ol class=\"arabic simple\">\n<li><p>Python の通常の名前解決順序を使って (子クラスの名前は他を全て上書きし、次に最初の親クラスの名前、 というように) 、基底クラスのマネージャは常に子クラスに継承されます。</p></li>\n<li><p>モデルやその親クラスでマネージャが宣言されていない場合、Django は自動的に <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> マネージャを作成します。</p></li>\n<li><p>クラスのデフォルトマネージャは <a class=\"reference internal\" href=\"/ja/5.2/ref/models/options/#django.db.models.Options.default_manager_name\" title=\"django.db.models.Options.default_manager_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.default_manager_name</span></code></a> で選択されたマネージャか、モデル上で最初に宣言されたマネージャか、最初の親モデルのデフォルトマネージャです。</p></li>\n</ol>\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=\"w\"> </span><span class=\"nc\">AbstractBase</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">CustomManager</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">abstract</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>これを子クラスで直接使用した場合、子クラスでマネージャを宣言していなければ <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> がデフォルトのマネージャになります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildA</span><span class=\"p\">(</span><span class=\"n\">AbstractBase</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># This class has CustomManager as the default manager.</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBase</span></code> を継承して別のデフォルトマネージャを指定したい場合は、子クラスにそのデフォルトマネージャを指定できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildB</span><span class=\"p\">(</span><span class=\"n\">AbstractBase</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># An explicit default manager.</span>\n    <span class=\"n\">default_manager</span> <span class=\"o\">=</span> <span class=\"n\">OtherManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>上記では <code class=\"docutils literal notranslate\"><span class=\"pre\">default_manager</span></code> がデフォルトです。 <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> マネージャは継承されているのでまだ使用可能ですが、デフォルトでは使用されません。</p>\n<p>最後に、この例では <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBase</span></code> のデフォルトを使用しつつ、子クラスに追加のマネージャを追加したいとします。 新しいマネージャを子クラスに直接追加することはできません。デフォルトをオーバーライドすることになり、抽象基底クラスのすべてのマネージャを明示的にインクルードする必要があるからです。解決策としては、追加のマネージャを別の基底クラスに置き、それをデフォルトクラスの <em>後の</em> 継承階層に含めることです:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ExtraManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">extra_manager</span> <span class=\"o\">=</span> <span class=\"n\">OtherManager</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">abstract</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildC</span><span class=\"p\">(</span><span class=\"n\">AbstractBase</span><span class=\"p\">,</span> <span class=\"n\">ExtraManager</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># Default manager is CustomManager, but OtherManager is</span>\n    <span class=\"c1\"># also available via the &quot;extra_manager&quot; attribute.</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>抽象モデル上でカスタムマネージャを <em>定義</em> することはできますが、抽象モデルを使ってメソッドを <em>呼び出す</em> ことはできないことに注意してください。 つまり:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">ClassA</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">do_something</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>上記は有効なコードですが、:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">AbstractBase</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">do_something</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>上記では例外が発生します。 これはマネージャがオブジェクトのコレクションを管理するためのロジックをカプセル化することを想定しているためです。抽象オブジェクトのコレクションを持つことはできないので、それらを管理することは意味がありません。抽象モデルに適用される機能がある場合、その機能は抽象モデルの staticmethod か classmethod に置くべきです。</p>\n</section>\n<section id=\"implementation-concerns\">\n<h3>実装する際の注意<a class=\"heading-anchor\" href=\"#implementation-concerns\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>カスタムマネージャにどのような機能を追加するにしても、マネージャインスタンスの浅いコピーを作成できることが必須です:</p>\n<div class=\"code-block\" data-language=\"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\">import</span><span class=\"w\"> </span><span class=\"nn\">copy</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">manager</span> <span class=\"o\">=</span> <span class=\"n\">MyManager</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">my_copy</span> <span class=\"o\">=</span> <span class=\"n\">copy</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">manager</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Django は特定のクエリ中にマネージャオブジェクトの浅いコピーを作成します。マネージャがコピーできない場合、これらのクエリは失敗します。</p>\n<p>ほとんどのカスタムマネージャでは問題にならないでしょう。単純なメソッドを <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> に追加するだけであれば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> のインスタンスをコピー不可能にすることはまずありません。しかし、オブジェクトの状態をコントロールする <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> オブジェクトの <code class=\"docutils literal notranslate\"><span class=\"pre\">__getattr__</span></code> やその他のプライベートメソッドをオーバーライドする場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> のコピー機能に影響を与えないようにする必要があります。</p>\n</section>\n</section>","rootId":"managers","toc":[{"title":"マネージャの名前","anchor":"manager-names","children":[]},{"title":"マネージャのカスタマイズ","anchor":"custom-managers","children":[{"title":"マネージャに新しいメソッドを追加する","anchor":"adding-extra-manager-methods","children":[]},{"title":"マネージャが初めに返す QuerySet を修正する","anchor":"modifying-a-manager-s-initial-queryset","children":[]},{"title":"デフォルトマネージャ","anchor":"default-managers","children":[]},{"title":"ベースマネージャ","anchor":"base-managers","children":[{"title":"マネージャによるリレーション先オブジェクトへのアクセス","anchor":"using-managers-for-related-object-access","children":[]},{"title":"このタイプのマネージャのサブクラスでは、結果をフィルタリングしないでください。","anchor":"don-t-filter-away-any-results-in-this-type-of-manager-subclass","children":[]}]},{"title":"カスタマイズした QuerySet のメソッド をマネージャから呼び出す","anchor":"calling-custom-queryset-methods-from-the-manager","children":[]},{"title":"QuerySet のメソッドで、マネージャを生成する","anchor":"creating-a-manager-with-queryset-methods","children":[{"title":"from_queryset()","anchor":"from-queryset","children":[]}]},{"title":"カスタムマネージャとモデルの継承","anchor":"custom-managers-and-model-inheritance","children":[]},{"title":"実装する際の注意","anchor":"implementation-concerns","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/5.2/topics/"},{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/5.2/topics/db/"}],"prev":{"docname":"topics/db/search","title":"検索","url":"/ja/5.2/topics/db/search/"},"next":{"docname":"topics/db/sql","title":"素の SQL 文の実行","url":"/ja/5.2/topics/db/sql/"},"formats":{"html":"/ja/5.2/topics/db/managers/","markdown":"/ja/5.2/topics/db/managers.md","json":"/ja/5.2/topics/db/managers.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/db/managers.txt","official":"https://docs.djangoproject.com/ja/5.2/topics/db/managers/","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"]}