{"title":"Pengelola","version":"2.0","locale":"id","docname":"topics/db/managers","url":"/id/2.0/topics/db/managers/","canonical":"https://djangodocs.dev/id/2.0/topics/db/managers/","summary":"class Manager Link to this definition # Sebuah manager adalah antarmuka melalui mana tindakan permintaan basisdata disediakan pada model Django. Setidaknya satu…","html":"<h1>Pengelola<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>Sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">manager</span></code> adalah antarmuka melalui mana tindakan permintaan basisdata disediakan pada model Django. Setidaknya satu <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> ada untuk setiap model dalam sebuah apliaksi Django.</p>\n<p>Cara kelas-kelas <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> bekerja didokumentasikan dalam <a class=\"reference internal\" href=\"/id/2.0/topics/db/queries/\"><span class=\"doc\">Membuat query</span></a>; dokumen ini secara khusus menyentuh pada pilihan model yang menyesuaikan perilaku <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>.</p>\n<section id=\"manager-names\">\n<span id=\"id1\"></span><h2>Nama pengelola<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>Secara awalan, Django menambah sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> dengan nama <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> pada setiap kelas model Django. Bagaimanapun, jika anda ingin menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> sebagai sebuah nama bidang, atau jika anda ingin menggunakan sebuah nama selain dari <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>, anda dapat menamai kembali itu pada berdasarkan per-model. Untuk menamai kembali <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> untuk kelas diberikan, tentukan sebuah atribut kelas dari jenis <code class=\"docutils literal notranslate\"><span class=\"pre\">models.Manager()</span></code> pada model itu. Sebagai contoh:</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<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>Menggunakan model contoh ini, <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.objects</span></code> akanmembangkitkan sebuah pengecualian <code class=\"docutils literal notranslate\"><span class=\"pre\">AttributeError</span></code>, tetapi <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people.all()</span></code> akan menyediakan daftar dari semua obyek <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>Pengelolaan penyesuaian<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>Anda dapat menggunakan sebuah penyesuaian <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> dalam model tertentu dengan memperpanjang kelas <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> dasar dan menginstansiasi penyesuaian <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> anda dalam model anda.</p>\n<p>Ada dua alasan anda mungkin ingin menyesuaikan sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>: untuk menambah metode <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> tambahan, dan/atau merubah <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> awal kembalian <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>.</p>\n<section id=\"adding-extra-manager-methods\">\n<h3>Menambahkan metode pengelolaan tambahan<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>Menambahkan metode <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> tambahan adalah cara disukai untuk menambah fungsionalitas &quot;table-level&quot; pada model anda. (Untuk fungsionalitas &quot;row-level&quot; -- yaitu yang bertindak pada sebuah instance tunggal dari sebuah obyek model -- gunakan <a class=\"reference internal\" href=\"/id/2.0/topics/db/models/#model-methods\"><span class=\"std std-ref\">Model methods</span></a>, bukan penyesuaian metode <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>.)</p>\n<p>Sebuah metode <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> penyesuaian dapat mengembalikan apapun anda inginkan. Itu tidak harus mengembalikan sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p>\n<p>Sebagai contoh, <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> penyesuaian ini menawarkan sebuah metode <code class=\"docutils literal notranslate\"><span class=\"pre\">with_counts()</span></code>, yang mengembalikan sebuah daftar dari semua obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">OpinionPoll</span></code>, setiap dengan sebuah atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">num_responses</span></code> tambahan yaitu hasil dari sebuah pengumpulan permintaan:</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<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=\"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\">connection</span>\n        <span class=\"k\">with</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">cursor</span><span class=\"p\">()</span> <span class=\"k\">as</span> <span class=\"n\">cursor</span><span class=\"p\">:</span>\n            <span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;&quot;&quot;</span>\n<span class=\"s2\">                SELECT p.id, p.question, p.poll_date, COUNT(*)</span>\n<span class=\"s2\">                FROM polls_opinionpoll p, polls_response r</span>\n<span class=\"s2\">                WHERE p.id = r.poll_id</span>\n<span class=\"s2\">                GROUP BY p.id, p.question, p.poll_date</span>\n<span class=\"s2\">                ORDER BY p.poll_date DESC&quot;&quot;&quot;</span><span class=\"p\">)</span>\n            <span class=\"n\">result_list</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n            <span class=\"k\">for</span> <span class=\"n\">row</span> <span class=\"ow\">in</span> <span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">fetchall</span><span class=\"p\">():</span>\n                <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"n\">row</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">question</span><span class=\"o\">=</span><span class=\"n\">row</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">],</span> <span class=\"n\">poll_date</span><span class=\"o\">=</span><span class=\"n\">row</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">])</span>\n                <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">num_responses</span> <span class=\"o\">=</span> <span class=\"n\">row</span><span class=\"p\">[</span><span class=\"mi\">3</span><span class=\"p\">]</span>\n                <span class=\"n\">result_list</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">result_list</span>\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\">poll_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</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<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=\"n\">person_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\">response</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Dengan contoh ini, anda akan menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">OpinionPoll.objects.with_counts()</span></code> untuk mengembalikan daftar itu dari obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">OpinionPoll</span></code> dengan atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">num_responses</span></code>.</p>\n<p>Hal lain untuk dicatat tentang contoh ini adalah bahwa metode <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> dapat mengakses <code class=\"docutils literal notranslate\"><span class=\"pre\">self.model</span></code> untuk mendapatkan kelas model dimana mereka dilampirkan.</p>\n</section>\n<section id=\"modifying-a-manager-s-initial-queryset\">\n<h3>Merubah <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> awal pengelolaan<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>Dasar <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> mengembalikan semua obyek-obyek di sistem. Sebagai contoh, menggunakan model ini:</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<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>...pernyataan <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.all()</span></code> akan mengembalikan semua buku-buku di basisdata.</p>\n<p>Anda dapat menimpa <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dasar <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> dengan menimpa metode <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager.get_queryset()</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> harus mengembalikan sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dengan sifat-sifat anda butuhkan.</p>\n<p>Sebagai contoh, model berikut mempunyai <em>dua</em> <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> -- satu yang mengembalikan semua obyek, dan satu yang mengembalikan hanya buku-buku oleh 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=\"s1\">&#39;Roald Dahl&#39;</span><span class=\"p\">)</span>\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>Dengan model contoh ini, <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.all()</span></code> akan mengembalikan semua buku-buku di basisdata, tetapi <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.dahl_objects.all()</span></code> akan hanya mengembalikan satu yang ditulis oleh Roald Dahl.</p>\n<p>Tentu saja, karena <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> mengembalikan sebuah obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, anda dapat menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> dan semua dari metode <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> lain pada itu. Jadi pernyataan ini adalah semua sah:</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=\"s1\">&#39;Matilda&#39;</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>Contoh ini juga menunjuk teknik menarik lainnya: menggunakan banyak pengelola pada model sama. Anda dapat melampirkan sebanyak instance <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager()</span></code> pada sebuah model sesuka anda. Ini adalah cara mudah untuk menentukan &quot;filters&quot; umum untuk model anda.</p>\n<p>Sebagai contoh:</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=\"s1\">&#39;A&#39;</span><span class=\"p\">)</span>\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=\"s1\">&#39;E&#39;</span><span class=\"p\">)</span>\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=\"s1\">&#39;A&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Author&#39;</span><span class=\"p\">)),</span> <span class=\"p\">(</span><span class=\"s1\">&#39;E&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Editor&#39;</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>Contoh ini mengizinkan anda meminta Person.authors.all()`, <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.editors.all()</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.people.all()</span></code>, menghasilkan hasil dapat diramalkan.</p>\n</section>\n<section id=\"default-managers\">\n<span id=\"id3\"></span><h3>Pengelola awal<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>Jika anda menggunakan obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> penyesuaian, ambil catatan bahwa <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> Django pertama hadapi (dalam urutan dimana mereka ditentukan dalam model) mempunyai sebuah keadaan khusus. Django menafsirkan <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> pertama ditentukan dalam sebuah kelas sebagai <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> &quot;default&quot;, dan beberapa bagian dari Django (termasuk <a class=\"reference internal\" href=\"/id/2.0/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dumpdata</span></code></a>) akan menggunakan yang <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> khusus untuk model itu. Sebagai sebuah hasil, itu adalah ide bagus untuk hati-hati dalam pilihan anda dari pengelola awalan untuk menghindari keadan dimana menimpa hasil <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> dalam sebuah ketidakmampuan mengambil obyek-obyek anda sukai bekerja dengannya.</p>\n<p>Anda dapat menentukan sebuah penyesuaian pengelolaan awalan menggunakan <a class=\"reference internal\" href=\"/id/2.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\"><span class=\"pre\">Meta.default_manager_name</span></code></a>.</p>\n<p>Jika anda sedang menulis beberapa kode yang harus menangani sebuah model tidak dikenal, sebagai contoh, dalam sebuah aplikasi pihak-ketiga yang menerapkan sebuah tampilan umum, gunakan pengelola ini (atau <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>) daripada beranggapan model mempunyai sebuah pengelola <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code>.</p>\n</section>\n<section id=\"base-managers\">\n<h3>Pengelolaan dasar<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>Menggunakan pengelola untuk akses obyek terkait<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>Secara awalan, Django menggunakan sebuah instance dari kelas pengelola <code class=\"docutils literal notranslate\"><span class=\"pre\">Model._base_manager</span></code> ketika mengakses obyek terkait (yaitu <code class=\"docutils literal notranslate\"><span class=\"pre\">choice.question</span></code>), bukan <code class=\"docutils literal notranslate\"><span class=\"pre\">_default_manager</span></code> pada obyek terkait. Ini karena Django butuh dapat mengambil obyek terkait, bahkan jika itu akan sebaliknya disaring (dan karenanya tidak dapat diakses) oleh pengelola awalan.</p>\n<p>Jika kelas pengelola dasar biasa (<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>) tidak sesuai untuk keadaan anda, anda dapat memberitahu Django kelas mana digunakan oleh pengaturan <a class=\"reference internal\" href=\"/id/2.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\"><span class=\"pre\">Meta.base_manager_name</span></code></a>.</p>\n<p>Base managers aren't used when querying on related models. For example, if the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> model <a class=\"reference internal\" href=\"/id/2.0/intro/tutorial02/#creating-models\"><span class=\"std std-ref\">from the tutorial</span></a> had a <code class=\"docutils literal notranslate\"><span class=\"pre\">deleted</span></code>\nfield and a base manager that filters out instances with <code class=\"docutils literal notranslate\"><span class=\"pre\">deleted=True</span></code>, a\nqueryset like <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice.objects.filter(question__name__startswith='What')</span></code>\nwould include choices related to deleted questions.</p>\n</section>\n<section id=\"don-t-filter-away-any-results-in-this-type-of-manager-subclass\">\n<h4>Jangan menyaring hasil apapun dalam jenis ini dari pengelola subkelas<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>Pengelola ini digunakan untuk mengakses obyek yang terkait pada dari beberapa model lain. Dalam keadaan tersebut, Django harus dapat melihat semua obyek untuk model itu sedang diambil, sehingga <em>apapun</em> yang mengacu dapat diambil.</p>\n<p>Jika anda menimpa metode <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> dan menyaring setiap baris, Django akan mengembalikan hasil salah. Jangan lakukan itu, Sebuah pengelola yang menyaring hasil dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> tidak sesuai untuk digunakan sebagai pengelola dasar.</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>Memanggil metode <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> penyesuaian dari pengelola<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>Selagi kebanyakan metode dari <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> standar dapat diakses langsung dari <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>, ini hanya kasus untuk metode tambahan ditentukan pada sebuah penyesuaian <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> jika anda juga menerapkan mereka pada <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=\"s1\">&#39;A&#39;</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=\"s1\">&#39;E&#39;</span><span class=\"p\">)</span>\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<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=\"s1\">&#39;A&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Author&#39;</span><span class=\"p\">)),</span> <span class=\"p\">(</span><span class=\"s1\">&#39;E&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Editor&#39;</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>Contoh ini mengizinkan anda memanggil kedua <code class=\"docutils literal notranslate\"><span class=\"pre\">authors()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">editors()</span></code> secara langsung dari pengelola <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>Membuat pengelola dengan cara <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>Sebagai pengganti dari pendekatan diatas yang membutuhkan metode penggandaan pada kedua <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>, <a class=\"reference internal\" href=\"/id/2.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\"><span class=\"pre\">QuerySet.as_manager()</span></code></a> dapat digunakan untuk membuat sebuah instance dari <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> dengan salinan dari sebuah metode <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> penyesuaian:</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>Instance <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> dibuat oleh <a class=\"reference internal\" href=\"/id/2.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\"><span class=\"pre\">QuerySet.as_manager()</span></code></a> akan secara virtual mirip pada <code class=\"docutils literal notranslate\"><span class=\"pre\">PersonManager</span></code> dari contoh sebelumnya.</p>\n<p>Tidak setiap metode <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> masuk akal pada tingkat <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>; sebagai contoh kami sengaja mencegah metode <a class=\"reference internal\" href=\"/id/2.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\"><span class=\"pre\">QuerySet.delete()</span></code></a> dari menjadi disalin ke atas kelas <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>.</p>\n<p>Cara disalin berdasarkan aturan berikut:</p>\n<ul class=\"simple\">\n<li><p>Cara umum disalin secara awal.</p></li>\n<li><p>Metode pribadi (mulai dengan sebuah garis bawah) tidak disalin secara awalan.</p></li>\n<li><p>Metode dengan atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset_only</span></code> disetel menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> adalah selalu disalin.</p></li>\n<li><p>Metode dengan atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset_only</span></code> disetel menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> adalah tidak pernah disalin.</p></li>\n</ul>\n<p>Sebagai contoh:</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    <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    <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>Untuk penggunaan lanjutan anda mungkin ingin kedua penyesuaian <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> dan penyesuaian <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Anda dapat melakukan itu dengan memanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager.from_queryset()</span></code> yang mengembalikan sebuah <em>subkelas</em> dari dasar <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> anda dengan salinan dari metode <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> penyesuaian:</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\">BaseManager</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<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<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\">BaseManager</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>Anda mungkin juga menyimpan kelas dibangkitkan kedalam sebuah variabel:</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\">CustomManager</span> <span class=\"o\">=</span> <span class=\"n\">BaseManager</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<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=\"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>Pengelolaan penyesuaian dan warisan model<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>Ini adalah bagaimana Django menangani pengelolaan penyesuaian dan <a class=\"reference internal\" href=\"/id/2.0/topics/db/models/#model-inheritance\"><span class=\"std std-ref\">model inheritance</span></a>:</p>\n<ol class=\"arabic simple\">\n<li><p>Pengelola dari kelas-kelas dasar selalu diwarisi oleh anak kelas, menggunakan urutan resolusi nama biasa Python (nama pada kelas anan menimpa semua lainnya; kemudian datang nama pada kelas induk pertama, dan seterusnya).</p></li>\n<li><p>Jika tidak ada pengelola dinyatakan pada model dan/atau induknya, Django secara otomatis membuat pengelola <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code>.</p></li>\n<li><p>Pengelola awalan pada sebuah kelas adalah antara satu dipilih dengan <a class=\"reference internal\" href=\"/id/2.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\"><span class=\"pre\">Meta.default_manager_name</span></code></a>, atau pengelola pertama dinyatakan pada model, atau pengelola awalan dari model induk pertama.</p></li>\n</ol>\n<p>Aturan-aturan ini menyediakan keluwesan yang dibutuhkan jika anda ingin memasang sebuah kumpulan dari penyesuaian pengelola pada sekelompok model, melalui sebuah kelas dasar, tetapi masih menyesuaikan pengelola awalan. Sebagai contoh, misalkan anda mempunyai kelas dasar ini:</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>Jika anda menggunakan ini langsung di sebuah subkelas, <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> akan berupa pengelola awalan jika anda menyatakan tidak ada pengelola di kelas dasar:</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>Jika anda ingin mewarisi dari <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBase</span></code>, tetapi menyediakan pengelola awalan berbeda, anda dapat menyediakan pengelola awalan pada kelas anak:</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>Disini, <code class=\"docutils literal notranslate\"><span class=\"pre\">default_manager</span></code> adalah awalan. Pengelola <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span></code> masih tersedia, sejak itu diwarisi. Itu hanya tidak digunakan sebagai awalan.</p>\n<p>Akhirnya untuk contoh ini, misalkan anda ingin menambah pengelola tambahan pada kelas anak, tetapi masih menggunakan awalan dari <code class=\"docutils literal notranslate\"><span class=\"pre\">AbstractBase</span></code>. Anda tidak dapat menambah pengelola baru langsung dalam kelas anak, seperti itu akan menimpa awalan dan anda akan juga jelas menyertakan semua pengelola dari kelas dasar abstrak. Pemecahannya adalah menaruh pengelola tambahan dalam kelas dasar lain dan memperkenalkan itu kedalam hirarki warisan <em>setelah</em> awalan:</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<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>Catat bahwa selagi anda dapat <em>menentukan</em> pengelolaan penyesuaian pada model abstrak, anda tidak dapat <em>meminta</em> metode apapun menggunakan model abstrak. Yaitu:</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>legal, tetapi:</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>akan memunculkan sebuah pengecualian. Ini karena pengelola bermaksud untuk mengenkapsulasi logika untuk mengelola kumpulan dari obyek. Sejak anda tidak dapat mempunyai sebuah kumpulan dari obyek-obyek abstrak, itu tidak masuk akal untuk mengelola mereka. Jika anda mempunyai fungsionalitas yang berlaku pada model abstrak, anda harus menaruh fungsionalitas itu dalam sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">staticmethod</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">classmethod</span></code> pada model abstrak.</p>\n</section>\n<section id=\"implementation-concerns\">\n<h3>Perhatian penerapan<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>Fitur-fitur apapun anda tambahkan ke <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> penyesuaian anda, itu harus mungkin untuk membuat salinan dangkal dari sebuah instance <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code>; yaitu, kode berikut harus bekerja:</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=\"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 membuat salinan dangkal dari obyek-obyek pengelola selama permintaan tertentu; jika Manager anda tidak dapat disalin, permintaan itu akan gagal.</p>\n<p>Ini tidak akan menjadi sebuah masalah untuk kebanyakan pengelola penyesuaian. Jika anda hanya menambahkan metode sederhana ke <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> anda, itu tidak mungkin bahwa anda akan secara tidak sengaja membuat instance-instance dari tidak dapat disalin <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> anda. Bagaimanapun, jika anda menimpa <code class=\"docutils literal notranslate\"><span class=\"pre\">__getattr__</span></code> atau beberapa metode pribadi lain dari obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> anda yang mengendalikan keadaan obyek, anda harus memastikan bahwa anda tidak mempengaruhi kemampuan dari <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> anda untuk disalin.</p>\n</section>\n</section>","rootId":"managers","toc":[{"title":"Nama pengelola","anchor":"manager-names","children":[]},{"title":"Pengelolaan penyesuaian","anchor":"custom-managers","children":[{"title":"Menambahkan metode pengelolaan tambahan","anchor":"adding-extra-manager-methods","children":[]},{"title":"Merubah QuerySet awal pengelolaan","anchor":"modifying-a-manager-s-initial-queryset","children":[]},{"title":"Pengelola awal","anchor":"default-managers","children":[]},{"title":"Pengelolaan dasar","anchor":"base-managers","children":[{"title":"Menggunakan pengelola untuk akses obyek terkait","anchor":"using-managers-for-related-object-access","children":[]},{"title":"Jangan menyaring hasil apapun dalam jenis ini dari pengelola subkelas","anchor":"don-t-filter-away-any-results-in-this-type-of-manager-subclass","children":[]}]},{"title":"Memanggil metode QuerySet penyesuaian dari pengelola","anchor":"calling-custom-queryset-methods-from-the-manager","children":[]},{"title":"Membuat pengelola dengan cara QuerySet","anchor":"creating-a-manager-with-queryset-methods","children":[{"title":"from_queryset()","anchor":"from-queryset","children":[]}]},{"title":"Pengelolaan penyesuaian dan warisan model","anchor":"custom-managers-and-model-inheritance","children":[]},{"title":"Perhatian penerapan","anchor":"implementation-concerns","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/2.0/topics/"},{"docname":"topics/db/index","title":"Model dan basisdata","url":"/id/2.0/topics/db/"}],"prev":{"docname":"topics/db/search","title":"Cari","url":"/id/2.0/topics/db/search/"},"next":{"docname":"topics/db/sql","title":"Melakukan permintaan SQL mentah","url":"/id/2.0/topics/db/sql/"},"formats":{"html":"/id/2.0/topics/db/managers/","markdown":"/id/2.0/topics/db/managers.md","json":"/id/2.0/topics/db/managers.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/topics/db/managers.txt","official":"https://docs.djangoproject.com/id/2.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","pt-br","ko","es","el","pl"]}