{"title":"マネージャ","version":"5.0","locale":"ja","docname":"topics/db/managers","url":"/ja/5.0/topics/db/managers/","canonical":"https://djangodocs.dev/ja/5.0/topics/db/managers/","summary":"マネージャ (Manager) とは、Django のモデルに対するデータベースクエリの操作を提供するインターフェイスです。","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\">class</span> </em><span class=\"sig-name descname\">Manager</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\">マネージャ (Manager)</code> とは、Django のモデルに対するデータベースクエリの操作を提供するインターフェイスです。Django アプリケーション内の1つのモデルに対して、<code class=\"docutils literal notranslate\">Manager</code> は最低でも1つは存在します。</p>\n<p><code class=\"docutils literal notranslate\">Manager</code> クラスの詳細については、<a class=\"reference internal\" href=\"/ja/5.0/topics/db/queries/\"><span class=\"doc\">クエリを作成する</span></a> に書かれています。ここでは、特に、<code class=\"docutils literal notranslate\">Manager</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\">objects</code> という名前の <code class=\"docutils literal notranslate\">Manager</code> を各 Django モデルクラスに対して追加します。しかし、もし <code class=\"docutils literal notranslate\">objects</code> をフィールド名として使いたい場合や、あるいは、<code class=\"docutils literal notranslate\">Manager</code> に対して <code class=\"docutils literal notranslate\">objects</code> 以外の名前を使いたい場合には、各モデル単位で好きな名前を付けることができます。あるクラスの <code class=\"docutils literal notranslate\">Manager</code> の名前を変えるには、そのクラスの上で <code class=\"docutils literal notranslate\">models.Manager()</code> と書いて、クラス変数を定義します。たとえば、次のように書きます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    people <span class=\"o\">=</span> models<span class=\"o\">.</span>Manager<span class=\"p\">()</span>\n</code></pre></div>\n<p>このモデル例を使うと、<code class=\"docutils literal notranslate\">Person.objects</code> は <code class=\"docutils literal notranslate\">AttributeError</code> 例外を起こしますが、<code class=\"docutils literal notranslate\">Person.people.all()</code> と書けば、すべての <code class=\"docutils literal notranslate\">Person</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\">Manager</code> ベースクラスを拡張し、カスタマイズした <code class=\"docutils literal notranslate\">Manager</code> をモデル内でインスタンス化すれば、特定のモデル用にカスタマイズした <code class=\"docutils literal notranslate\">Manager</code> を使うことができます。</p>\n<p><code class=\"docutils literal notranslate\">Manager</code> をカスタマイズしたくなるシチュエーションとしては、たとえば次の2つのような場合が考えられます。1つ目は、<code class=\"docutils literal notranslate\">Manager</code> に新しいメソッドを追加したい場合、もう1つは、<code class=\"docutils literal notranslate\">Manager</code> が最初に返す <code class=\"docutils literal notranslate\">QuerySet</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\">Manager</code> に新しいメソッドを追加するのがふさわしいのは、モデルに対する「テーブルレベル」での操作を追加したい場合です。(「低レベル」の機能、たとえば、あるモデルオブジェクトの1つのインスタンスに作用するような関数の場合には、<code class=\"docutils literal notranslate\">Manager</code> をカスタマイズするのではなく、<a class=\"reference internal\" href=\"/ja/5.0/topics/db/models/#model-methods\"><span class=\"std std-ref\">モデルメソッド</span></a> を使ってください。</p>\n<p>たとえば、このカスタム <code class=\"docutils literal notranslate\">Manager</code> は <code class=\"docutils literal notranslate\">with_counts()</code> メソッドを追加します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models.functions</span> <span class=\"kn\">import</span> Coalesce\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PollManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    <span class=\"k\">def</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>annotate<span class=\"p\">(</span>num_responses<span class=\"o\">=</span>Coalesce<span class=\"p\">(</span>models<span class=\"o\">.</span>Count<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=\"nc\">OpinionPoll</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    question <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    objects <span class=\"o\">=</span> PollManager<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Response</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    poll <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>OpinionPoll<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<p>この例では、 <code class=\"docutils literal notranslate\">OpinionPoll.objects.with_counts()</code> を使うことで、 <code class=\"docutils literal notranslate\">num_responses</code> 属性が付加された <code class=\"docutils literal notranslate\">OpinionPoll</code> オブジェクトの <code class=\"docutils literal notranslate\">QuerySet</code> を得ることができます。</p>\n<p><code class=\"docutils literal notranslate\">Manager</code> のカスタマイズメソッドは、どんなオブジェクトを返しても構いませんが、<code class=\"docutils literal notranslate\">QuerySet</code> だけは返してはいけません。</p>\n<p>注目すべきもう1つの点は、 <code class=\"docutils literal notranslate\">Manager</code> 内のメソッドではself.modelとすることで、 <code class=\"docutils literal notranslate\">Manager</code> に紐づいているモデルクラスを取得できることです。</p>\n</section>\n<section id=\"modifying-a-manager-s-initial-queryset\">\n<h3>マネージャが初めに返す <code class=\"docutils literal notranslate\">QuerySet</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\">Manager</code> のベース <code class=\"docutils literal notranslate\">QuerySet</code> は、すべてのオブジェクトを返します。 たとえば、このモデルの例では...:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</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\">100</span><span class=\"p\">)</span>\n    author <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Book.objects.all()</code> は、データベース内の全ての本を返します。</p>\n<p><code class=\"docutils literal notranslate\">Manager.get_queryset()</code> メソッドをオーバーライドすることで、 <code class=\"docutils literal notranslate\">Manager</code> のベース <code class=\"docutils literal notranslate\">QuerySet</code> を上書きできます。 <code class=\"docutils literal notranslate\">get_queryset()</code> は、必要な属性を含む <code class=\"docutils literal notranslate\">QuerySet</code> を返す必要があります。</p>\n<p>例えば、次のモデルには <em>2つ</em> の <code class=\"docutils literal notranslate\">Manager</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=\"nc\">DahlBookManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    <span class=\"k\">def</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>get_queryset<span class=\"p\">()</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>author<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=\"nc\">Book</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\">100</span><span class=\"p\">)</span>\n    author <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n\n    objects <span class=\"o\">=</span> models<span class=\"o\">.</span>Manager<span class=\"p\">()</span>  <span class=\"c1\"># The default manager.</span>\n    dahl_objects <span class=\"o\">=</span> DahlBookManager<span class=\"p\">()</span>  <span class=\"c1\"># The Dahl-specific manager.</span>\n</code></pre></div>\n<p>このモデルの例では、 <code class=\"docutils literal notranslate\">Book.objects.all()</code> はデータベース上の本を全て返 しますが、 <code class=\"docutils literal notranslate\">Book.dahl_objects.all()</code> は Roald Dahl の書いた本だけを返しま す。</p>\n<p><code class=\"docutils literal notranslate\">get_queryset()</code> は <code class=\"docutils literal notranslate\">QuerySet</code> オブジェクトを返すので、 <code class=\"docutils literal notranslate\">filter()</code> 、 <code class=\"docutils literal notranslate\">exclude()</code> 、その他の <code class=\"docutils literal notranslate\">QuerySet</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>Book<span class=\"o\">.</span>dahl_objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\nBook<span class=\"o\">.</span>dahl_objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Matilda&quot;</span><span class=\"p\">)</span>\nBook<span class=\"o\">.</span>dahl_objects<span class=\"o\">.</span>count<span class=\"p\">()</span>\n</code></pre></div>\n<p>この例では、同じモデルで複数のマネージャを使用するという、追加の面白いテクニックも紹介しました。一つのモデルに対して、好きなだけ <code class=\"docutils literal notranslate\">Manager()</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=\"nc\">AuthorManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    <span class=\"k\">def</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>get_queryset<span class=\"p\">()</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>role<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=\"nc\">EditorManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    <span class=\"k\">def</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>get_queryset<span class=\"p\">()</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>role<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=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    last_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    role <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> choices<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">:</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=\"p\">(</span><span class=\"s2\">&quot;Editor&quot;</span><span class=\"p\">)})</span>\n    people <span class=\"o\">=</span> models<span class=\"o\">.</span>Manager<span class=\"p\">()</span>\n    authors <span class=\"o\">=</span> AuthorManager<span class=\"p\">()</span>\n    editors <span class=\"o\">=</span> EditorManager<span class=\"p\">()</span>\n</code></pre></div>\n<p>この例では、<code class=\"docutils literal notranslate\">Person.authors.all()</code>、<code class=\"docutils literal notranslate\">Person.editors.all()</code>、<code class=\"docutils literal notranslate\">Person.people.all()</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\">Model.</span><span class=\"sig-name descname\">_default_manager</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\">Manager</code> オブジェクトを使う場合、 Django が (モデル内で定義された順番で) 最初に見つけた <code class=\"docutils literal notranslate\">Manager</code> には特別なステータスがあることに注意してください。Django はクラスで定義された最初の <code class=\"docutils literal notranslate\">Manager</code> を「デフォルト」の <code class=\"docutils literal notranslate\">Manager</code> と解釈し、Django の一部の機能 (<a class=\"reference internal\" href=\"/ja/5.0/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\">dumpdata</code></a> を含む) はそのモデル専用にその <code class=\"docutils literal notranslate\">Manager</code> を使用します。その結果、<code class=\"docutils literal notranslate\">get_queryset()</code> をオーバーライドした結果、利用したいオブジェクトを取得できなくなるという事態を避けるために、デフォルトマネージャの選択には注意した方が良いでしょう。</p>\n<p>カスタムのデフォルトマネージャは <a class=\"reference internal\" href=\"/ja/5.0/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\">Meta.default_manager_name</code></a> で指定できます。</p>\n<p>たとえば、ジェネリックビューを実装しているサードパーティのアプリで、未知のモデルを扱わなければならないコードを書いている場合、モデルが <code class=\"docutils literal notranslate\">objects</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\">_base_manager</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\">Model.</span><span class=\"sig-name descname\">_base_manager</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\">choice.question</code>) にアクセスする際に、リレーション先オブジェクトの <code class=\"docutils literal notranslate\">_default_manager</code> ではなく、 <code class=\"docutils literal notranslate\">Model._base_manager</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\">django.db.models.Manager</code></a>) があなたの環境に合わない場合、 <a class=\"reference internal\" href=\"/ja/5.0/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\">Meta.base_manager_name</code></a> を設定することで、 Django にどのクラスを使うかを指示できます。</p>\n<p>ベースマネージャはリレーション先モデルのクエリや、<a class=\"reference internal\" href=\"/ja/5.0/topics/db/queries/#backwards-related-objects\"><span class=\"std std-ref\">1対多や多対多のリレーションシップ</span></a> にアクセスする場合には使用されません。たとえば、 <a class=\"reference internal\" href=\"/ja/5.0/intro/tutorial02/#creating-models\"><span class=\"std std-ref\">チュートリアルの</span></a> <code class=\"docutils literal notranslate\">Question</code> モデルに <code class=\"docutils literal notranslate\">deleted</code> フィールドがあり、 <code class=\"docutils literal notranslate\">deleted=True</code> のインスタンスをフィルタリングするベースマネージャがあった場合、<code class=\"docutils literal notranslate\">Choice.objects.filter(question__name__startswith='What')</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\">get_queryset()</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\">QuerySet</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\">QuerySet</code> のほとんどのメソッドは <code class=\"docutils literal notranslate\">Manager</code> から直接アクセスできますが、カスタムの <code class=\"docutils literal notranslate\">QuerySet</code> で定義したメソッドは <code class=\"docutils literal notranslate\">Manager</code> でも実装する必要があります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonQuerySet</span><span class=\"p\">(</span>models<span class=\"o\">.</span>QuerySet<span class=\"p\">):</span>\n    <span class=\"k\">def</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>filter<span class=\"p\">(</span>role<span class=\"o\">=</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</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>filter<span class=\"p\">(</span>role<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=\"nc\">PersonManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    <span class=\"k\">def</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> PersonQuerySet<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>model<span class=\"p\">,</span> using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>_db<span class=\"p\">)</span>\n\n    <span class=\"k\">def</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>get_queryset<span class=\"p\">()</span><span class=\"o\">.</span>authors<span class=\"p\">()</span>\n\n    <span class=\"k\">def</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>get_queryset<span class=\"p\">()</span><span class=\"o\">.</span>editors<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    last_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    role <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> choices<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">:</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=\"p\">(</span><span class=\"s2\">&quot;Editor&quot;</span><span class=\"p\">)})</span>\n    people <span class=\"o\">=</span> PersonManager<span class=\"p\">()</span>\n</code></pre></div>\n<p>この例では <code class=\"docutils literal notranslate\">authors()</code> と <code class=\"docutils literal notranslate\">editors()</code> の両方をマネージャ <code class=\"docutils literal notranslate\">Person.people</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\">QuerySet</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\">QuerySet</code> と <code class=\"docutils literal notranslate\">Manager</code> の両方でメソッドを複製する必要がある上記の方法の代わりに、 <a class=\"reference internal\" href=\"/ja/5.0/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\">QuerySet.as_manager()</code></a> を使用すると、カスタムした <code class=\"docutils literal notranslate\">QuerySet</code> のメソッドをコピーした <code class=\"docutils literal notranslate\">Manager</code> のインスタンスを作成できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    people <span class=\"o\">=</span> PersonQuerySet<span class=\"o\">.</span>as_manager<span class=\"p\">()</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/5.0/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\">QuerySet.as_manager()</code></a> によって生成される <code class=\"docutils literal notranslate\">Manager</code> インスタンスは、前の例の <code class=\"docutils literal notranslate\">PersonManager</code> とほぼ同じになります。</p>\n<p>すべての <code class=\"docutils literal notranslate\">QuerySet</code> メソッドが <code class=\"docutils literal notranslate\">Manager</code> レベルで意味を持つわけではありません。例えば、 <a class=\"reference internal\" href=\"/ja/5.0/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\">QuerySet.delete()</code></a> メソッドが <code class=\"docutils literal notranslate\">Manager</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\">queryset_only</code> 属性が <code class=\"docutils literal notranslate\">False</code> に設定されているメソッドは常にコピーされます。</p></li>\n<li><p><code class=\"docutils literal notranslate\">queryset_only</code> 属性が <code class=\"docutils literal notranslate\">True</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=\"nc\">CustomQuerySet</span><span class=\"p\">(</span>models<span class=\"o\">.</span>QuerySet<span class=\"p\">):</span>\n    <span class=\"c1\"># Available on both Manager and QuerySet.</span>\n    <span class=\"k\">def</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=\"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=\"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    opted_out_public_method<span class=\"o\">.</span>queryset_only <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=\"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    _opted_in_private_method<span class=\"o\">.</span>queryset_only <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\">from_queryset()</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\">classmethod</span> </em><span class=\"sig-name descname\">from_queryset</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">queryset_class</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\">Manager</code> とカスタムの <code class=\"docutils literal notranslate\">QuerySet</code> の両方が必要になるかもしれません。この場合、 <code class=\"docutils literal notranslate\">Manager.from_queryset()</code> を呼び出すことで、カスタム <code class=\"docutils literal notranslate\">QuerySet</code> メソッドをコピーしたベース <code class=\"docutils literal notranslate\">Manager</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=\"nc\">CustomManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    <span class=\"k\">def</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=\"nc\">CustomQuerySet</span><span class=\"p\">(</span>models<span class=\"o\">.</span>QuerySet<span class=\"p\">):</span>\n    <span class=\"k\">def</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=\"nc\">MyModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    objects <span class=\"o\">=</span> CustomManager<span class=\"o\">.</span>from_queryset<span class=\"p\">(</span>CustomQuerySet<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>MyManager <span class=\"o\">=</span> CustomManager<span class=\"o\">.</span>from_queryset<span class=\"p\">(</span>CustomQuerySet<span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    objects <span class=\"o\">=</span> MyManager<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.0/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\">objects</code> マネージャを作成します。</p></li>\n<li><p>クラスのデフォルトマネージャは <a class=\"reference internal\" href=\"/ja/5.0/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\">Meta.default_manager_name</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=\"nc\">AbstractBase</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    objects <span class=\"o\">=</span> CustomManager<span class=\"p\">()</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        abstract <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>これを子クラスで直接使用した場合、子クラスでマネージャを宣言していなければ <code class=\"docutils literal notranslate\">objects</code> がデフォルトのマネージャになります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ChildA</span><span class=\"p\">(</span>AbstractBase<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\">AbstractBase</code> を継承して別のデフォルトマネージャを指定したい場合は、子クラスにそのデフォルトマネージャを指定できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ChildB</span><span class=\"p\">(</span>AbstractBase<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># An explicit default manager.</span>\n    default_manager <span class=\"o\">=</span> OtherManager<span class=\"p\">()</span>\n</code></pre></div>\n<p>上記では <code class=\"docutils literal notranslate\">default_manager</code> がデフォルトです。 <code class=\"docutils literal notranslate\">objects</code> マネージャは継承されているのでまだ使用可能ですが、デフォルトでは使用されません。</p>\n<p>最後に、この例では <code class=\"docutils literal notranslate\">AbstractBase</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=\"nc\">ExtraManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    extra_manager <span class=\"o\">=</span> OtherManager<span class=\"p\">()</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        abstract <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ChildC</span><span class=\"p\">(</span>AbstractBase<span class=\"p\">,</span> ExtraManager<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>ClassA<span class=\"o\">.</span>objects<span class=\"o\">.</span>do_something<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>AbstractBase<span class=\"o\">.</span>objects<span class=\"o\">.</span>do_something<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=\"nn\">copy</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>manager <span class=\"o\">=</span> MyManager<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>my_copy <span class=\"o\">=</span> copy<span class=\"o\">.</span>copy<span class=\"p\">(</span>manager<span class=\"p\">)</span>\n</code></pre></div>\n<p>Django は特定のクエリ中にマネージャオブジェクトの浅いコピーを作成します。マネージャがコピーできない場合、これらのクエリは失敗します。</p>\n<p>ほとんどのカスタムマネージャでは問題にならないでしょう。単純なメソッドを <code class=\"docutils literal notranslate\">Manager</code> に追加するだけであれば、 <code class=\"docutils literal notranslate\">Manager</code> のインスタンスをコピー不可能にすることはまずありません。しかし、オブジェクトの状態をコントロールする <code class=\"docutils literal notranslate\">Manager</code> オブジェクトの <code class=\"docutils literal notranslate\">__getattr__</code> やその他のプライベートメソッドをオーバーライドする場合は、 <code class=\"docutils literal notranslate\">Manager</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.0/topics/"},{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/5.0/topics/db/"}],"prev":{"docname":"topics/db/search","title":"検索","url":"/ja/5.0/topics/db/search/"},"next":{"docname":"topics/db/sql","title":"素の SQL 文の実行","url":"/ja/5.0/topics/db/sql/"},"formats":{"html":"/ja/5.0/topics/db/managers/","markdown":"/ja/5.0/topics/db/managers.md","json":"/ja/5.0/topics/db/managers.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/topics/db/managers.txt","official":"https://docs.djangoproject.com/ja/5.0/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","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}