{"title":"Basisdata banyak","version":"4.0","locale":"id","docname":"topics/db/multi-db","url":"/id/4.0/topics/db/multi-db/","canonical":"https://djangodocs.dev/id/4.0/topics/db/multi-db/","summary":"Panduan topik ini menggambarkan dukungan Django untuk interaksi dengan banyak basisdata. Kebanyakan dari sisa dokumentasi Djangomenganggap anda berinteraksi dengan…","html":"<h1>Basisdata banyak<a class=\"heading-anchor\" href=\"#multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Panduan topik ini menggambarkan dukungan Django untuk interaksi dengan banyak basisdata. Kebanyakan dari sisa dokumentasi Djangomenganggap anda berinteraksi dengan basisdata tunggal. Jika anda ingin berinteraksi dengan banyak basisdata, anda akan butuh mengambil beberapa langkah-langkah tambahan.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Lihat juga</p>\n<p>Lihat <a class=\"reference internal\" href=\"/id/4.0/topics/testing/tools/#testing-multi-db\"><span class=\"std std-ref\">Dukungan banyak-basisdata</span></a> untuk informasi tentang percobaan dengan banyak basisdata.</p>\n</aside>\n<section id=\"defining-your-databases\">\n<h2>Menentukan basisdata anda<a class=\"heading-anchor\" href=\"#defining-your-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Langkah pertama untuk menggunakan lebih dari satu basisdata dengan Django adalah memberitahu Django tentang peladen basisdata anda akan gunakan. Ini dilakukan menggunakan pengaturan <a class=\"reference internal\" href=\"/id/4.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>. Pengaturan ini memetakan nama lain basisdata, yang adalah cara mengacu ke basisdata tertentu sepanjang Django, ke sebuah kamus dari pengaturan untuk hubungan tertentu itu. Pengaturan di sebelah dalam kamus digambarkan sepenuhnya dalam dokumentasi <a class=\"reference internal\" href=\"/id/4.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>.</p>\n<p>Basisdata dapat mempunyai nama lain apapun anda pilih. Bagaimanapun, nama lain <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> mempunyai makna khusus. Django menggunakan basisdata dengan nama lain dari <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> ketika tidak ada lagi basisdata telah dipilih.</p>\n<p>Berikut adalah sebuah contoh potongan <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> menentukan dua basisdata -- sebuah awalan basisdata PostgreSQL dan basisdata MySQL disebut <code class=\"docutils literal notranslate\"><span class=\"pre\">users</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;app_data&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.postgresql&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;postgres_user&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PASSWORD&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;s3krit&#39;</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;users&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;user_data&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.mysql&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;mysql_user&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PASSWORD&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;priv4te&#39;</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Jika konsep dari basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> tidak masuk akal dalam konteks proyek anda, anda butuh berhati-hati untuk selalu menentukan basisdata anda ingin gunakan. Django membutuhkan masukan basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> untuk ditentukan, tetapi parameter dictionary dapat berupa kosong jika itu akan tidak digunakan. Untuk melakkukan ini, anda harus menyetel <a class=\"reference internal\" href=\"/id/4.0/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASE_ROUTERS</span></code></a> untuk semua dari model aplikasi anda, termasuk itu dalam bantuan dan aplikasi pihak-ketiga apapun anda sedang gunakan, sehingga tidak ada permintaan ke basisdata awalan. Berikut adalah contoh potongan <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> menentukan basisdata dua bukan-awalan, dengan masukan <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> sengaja dibiarkan kosong:</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\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{},</span>\n    <span class=\"s1\">&#39;users&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;user_data&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.mysql&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;mysql_user&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PASSWORD&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;superS3cret&#39;</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;customers&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;customer_data&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.mysql&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;mysql_cust&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PASSWORD&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;veryPriv@ate&#39;</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>If you attempt to access a database that you haven't defined in your\n<a class=\"reference internal\" href=\"/id/4.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> setting, Django will raise a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.connection.ConnectionDoesNotExist</span></code> exception.</p>\n</section>\n<section id=\"synchronizing-your-databases\">\n<span id=\"synchronizing-multiple-databases\"></span><h2>Sinkronisasi basisdata anda<a class=\"heading-anchor\" href=\"#synchronizing-your-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Perintah pengelolaan <a class=\"reference internal\" href=\"/id/4.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> berjalan pada satu basisdata pada satu waktu. Secara awalan, itu berjalan pada basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>, tetapi dengan menyediakan pilihan <code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--database</span> <span class=\"pre\">1</span></code>, anda dapat memberitahu itu untuk mensinkronkan basisdata berbeda. Jadi, untuk mensinkronkan semua kedalam semua basisdata dalam contoh pertama diatas, anda akan butuh memanggil:</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>$ ./manage.py migrate\n$ ./manage.py migrate --database=users\n</code></pre></div>\n<p>Jika anda tidak ingin setiap aplikasi disinkronkan kedalam basisdata tertentu, anda dapat menentukan <span class=\"xref std std-ref\">database router1</span> yang menerapkan batasan kebijakan ketersediaan dari model tertentu.</p>\n<p>Jika, seperti dalam contoh kedua diatas, anda telah meninggalkan basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> kosong, anda harus menyediakan sebuah nama basisdata setiap waktu anda menjalankan <a class=\"reference internal\" href=\"/id/4.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a>. Menghilangkan nama basisdata akan memunculkan sebuah kesalahan. Untuk contoh kedua:</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>$ ./manage.py migrate --database=users\n$ ./manage.py migrate --database=customers\n</code></pre></div>\n<section id=\"using-other-management-commands\">\n<h3>Menggunakan perintah pengelolaan lain<a class=\"heading-anchor\" href=\"#using-other-management-commands\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Kebanyakan perintah <code class=\"docutils literal notranslate\"><span class=\"pre\">django-admin</span></code> lain yang berinteraksi dengan basisdata berjalan dalam cara sama seperti <a class=\"reference internal\" href=\"/id/4.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> -- mereka hanya berjalan pada satu basisdata pada satu waktu, menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">--database</span></code> untuk mengendalikan penggunaan basisdata.</p>\n<p>Sebuah pengecualian pada aturan ini adalah perintah <a class=\"reference internal\" href=\"/id/4.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a>. Itu mengecek riwayat perpindahan di basisdata untuk menangkap masalah dengan berkas perpindahan yang ada (yang dapat disebabkan dengan menyunting mereka) sebelum membuat perpindahan baru. Secara awalan, itu memeriksa hanya basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>, tetapi itu merundingkan metode <a class=\"reference internal\" href=\"#allow_migrate\" title=\"allow_migrate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code></a> dari <a class=\"reference internal\" href=\"#topics-db-multi-db-routing\"><span class=\"std std-ref\">routers</span></a> jika apapun terpasang.</p>\n</section>\n</section>\n<section id=\"automatic-database-routing\">\n<span id=\"topics-db-multi-db-routing\"></span><h2>Perute basisdata otomatis<a class=\"heading-anchor\" href=\"#automatic-database-routing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Cara termudah menggunakan banyak basisdata adalah menyetel skema perutean basisdata. Skema perutean awalan memastikan bahwa obyek tetap 'sticky' ke basisdata aslinya (yaitu, obyek diambil dari basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> akan disimpan pada basisdata sama). Skema perute awalan memastikan bahwa jika sebuah absisdata tidak ditentukan, semua permintaan kembali ke basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>.</p>\n<p>Anda tidak perlu melakukan apapun untuk mengaktifkan skema perutean awalan -- itu disediakan 'beda dari biasanya' pada setiap proyek Django. Bagaimanapun, jika anda ingin menerapkan lebih menarik perilaku peruntukan basisdata, anda dapat menentukan dan memasang perute basisdata anda sendiri.</p>\n<section id=\"database-routers\">\n<h3>Router basisdata<a class=\"heading-anchor\" href=\"#database-routers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Perute basisdata adalah kelas yang menyediakan sampai empat metode:</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"db_for_read\">\n<span class=\"sig-name descname\"><span class=\"pre\">db_for_read</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">hints</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#db_for_read\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Sarankan basisdata yang harus digunakan untuk membaca tindakan-tindakan untuk obyek dari jenis <code class=\"docutils literal notranslate\"><span class=\"pre\">model</span></code>.</p>\n<p>Jika tindakan basisdata dapat menyediakan informasi tambahan apapun yang mungkin membantu dalam memilih basisdata, itu akan menyediakan dalam dictionary <code class=\"docutils literal notranslate\"><span class=\"pre\">hints</span></code>. Rincian pada peunjuk sah disediakan <span class=\"xref std std-ref\">below 1</span>.</p>\n<p>Mengembalikan <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> jika tidak ada saran.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"db_for_write\">\n<span class=\"sig-name descname\"><span class=\"pre\">db_for_write</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">hints</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#db_for_write\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Sarankan basisdata yang harus digunakan untuk menulis dari obyek dari jenis Model.</p>\n<p>Jika tindakan basisdata dapat menyediakan informasi tambahan apapun yang mungkin membantu dalam memilih basisdata, itu akan menyediakan dalam dictionary <code class=\"docutils literal notranslate\"><span class=\"pre\">hints</span></code>. Rincian pada peunjuk sah disediakan <span class=\"xref std std-ref\">below 1</span>.</p>\n<p>Mengembalikan <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> jika tidak ada saran.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"allow_relation\">\n<span class=\"sig-name descname\"><span class=\"pre\">allow_relation</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">obj1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">obj2</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">hints</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#allow_relation\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Mengembalikan <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> jika sebuah hubungan diantara <code class=\"docutils literal notranslate\"><span class=\"pre\">obj1</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">obj2</span></code> harus diizinkan, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> jika hubungan harus dicegah, atau <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> jika perute tidak memiliki pendapat. Ini adalah murni tindakan pengesahan, digunakan oleh foreign key dan tindakan many to many untuk menentukan jika hubungan harus diizinkan diantara dua obyek.</p>\n<p>If no router has an opinion (i.e. all routers return <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>), only\nrelations within the same database are allowed.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"allow_migrate\">\n<span class=\"sig-name descname\"><span class=\"pre\">allow_migrate</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">db</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">app_label</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">hints</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#allow_migrate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Tentukan jika tindakan perpindahan diizinkan untuk menjalankan pada basisdata dengan nama lain <code class=\"docutils literal notranslate\"><span class=\"pre\">db</span></code>. Mengembalikan <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> jika tindakan harus berjalan, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> jika itu tidak harus berjalan, atau <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> jika perute tidak memiliki pendapat.</p>\n<p>Argumen penempatan <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code> adalah label untuk aplikasi sedang dipindahkan.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> disetel oleh kebanyakan tindakan perpindahan pada nilai dari <code class=\"docutils literal notranslate\"><span class=\"pre\">model._meta.model_name</span></code> (versi huruf kecil dari model <code class=\"docutils literal notranslate\"><span class=\"pre\">__name__</span></code>) dari model sedang dipindahkan. Nilai itu adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> untuk tindakan <a class=\"reference internal\" href=\"/id/4.0/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunPython</span></code></a> dan <a class=\"reference internal\" href=\"/id/4.0/ref/migration-operations/#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunSQL</span></code></a> meskipun mereka menyediakan itu menggunakan petunjuk.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">hints</span></code> digunakan oleh tindakan tertentu untuk berkomunikasi informasi tambahan ke perute.</p>\n<p>Ketika <code class=\"docutils literal notranslate\"><span class=\"pre\">hints</span></code> disetel, <code class=\"docutils literal notranslate\"><span class=\"pre\">hints</span></code> biasanya mengandung kelas model dibawah kunci <code class=\"docutils literal notranslate\"><span class=\"pre\">'model'</span></code>. Catat bahwa itu mungkin berupa <span class=\"xref std std-ref\">historical model 1</span>, dan dengan demikian tidak mempunyai atribut penyesuaian apapun, metode, atau pengelola. Anda harus hanya bergantung pada <code class=\"docutils literal notranslate\"><span class=\"pre\">_meta</span></code>.</p>\n<p>Metode ini dapat juga digunakan untuk menentukan ketersediaan dari sebuah model pada basisdata yang diberikan.</p>\n<p><a class=\"reference internal\" href=\"/id/4.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> selalu membuat perpindahan untuk perubahan model, tetapi jika <code class=\"docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code> mengembalikan <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, tindakan perpindahan apapun untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> akan secara diam dilewatkan ketika menjalankan <a class=\"reference internal\" href=\"/id/4.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> pada <code class=\"docutils literal notranslate\"><span class=\"pre\">db</span></code>. Merubah perilaku dari <code class=\"docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code> untuk model yang sudah berpindah mungkin menghasilkan rusak dalam foreign key, tabel tambahan, atau tabel hilang. Ketika <a class=\"reference internal\" href=\"/id/4.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> memeriksa riwayat perpindahan, itu melewati basisdata dimana tidak ada aplikasi diizinkan berpindah.</p>\n</dd></dl>\n\n<p>Perute tidak harus menyediakan <em>semua</em> metode ini -- itu mungkin menghilangkan satu atau lebih dari mereka. Jika satu dari metode ini dihilangkan, Django akan melewati perute itu ketika melakukan pemeriksaan terkait.</p>\n<section id=\"hints\">\n<span id=\"topics-db-multi-db-hints\"></span><h4>Petunjuk<a class=\"heading-anchor\" href=\"#hints\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Petunjuk diterima oleh perute basisdata dapat digunakan untuk memutuskan basisdata mana harus menerima permintaan yang diberikan.</p>\n<p>Saat sekarang, petunjuk satu-satunya akan disediakan adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code>, sebuah instance obyek yang terkait ke tindakan baca atau tulis yang berlangsung. Ini mungkin instance yang sedang disimpan, atau itu mungkin berupa sebuah instance yang sedang ditambahkan dalam hubungan many-to-many. Dalam beberapa kasus, tidak ada petunjuk instance akan disediakan sama sekali. Perute memeriksa untuk kehadiran dari sebuah petunjuk instance, dan menentukan jika petunjuk itu harus digunakan untuk merubah perulaku perutean.</p>\n</section>\n</section>\n<section id=\"using-routers\">\n<h3>Menggunakan router<a class=\"heading-anchor\" href=\"#using-routers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Perute basisdata dipasang menggunakan pengaturan <a class=\"reference internal\" href=\"/id/4.0/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASE_ROUTERS</span></code></a>. Pengaturan ini menentukan daftar dari nama-nama kelas, setiap menentukan perute harus digunakan dengan perute master (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.router</span></code>).</p>\n<p>The master router is used by Django's database operations to allocate\ndatabase usage. Whenever a query needs to know which database to use,\nit calls the master router, providing a model and a hint (if\navailable). Django then tries each router in turn until a database\nsuggestion can be found. If no suggestion can be found, it tries the\ncurrent <a class=\"reference internal\" href=\"/id/4.0/ref/models/instances/#django.db.models.Model._state\" title=\"django.db.models.Model._state\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">instance._state.db</span></code></a> of the hint\ninstance. If a hint instance wasn't provided, or <a class=\"reference internal\" href=\"/id/4.0/ref/models/instances/#django.db.models.Model._state\" title=\"django.db.models.Model._state\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">instance._state.db</span></code></a> is <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, the master router will allocate\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> database.</p>\n</section>\n<section id=\"an-example\">\n<h3>Sebuah contoh<a class=\"heading-anchor\" href=\"#an-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition-example-purposes-only admonition\">\n<p class=\"admonition-title\">Hanya bertujuan contoh!</p>\n<p>Contoh ini dimaksudkan sebagai pertunjukan dari bagaimana infrastruktur perute dapat digunakan untuk mengubah penggunaan basisdata. Itu sengaja mengabaikan beberapa masalah rumit untuk mempertunjukkan bagaimana perute digunakan.</p>\n<p>Contoh ini tidak akan bekerja jika apapun dari model dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp</span></code> mengandung hubungan pada model diluar dari basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">other</span></code>. <span class=\"xref std std-ref\">Cross-database relationships 1</span> memperkenalkan masalah kesatuan referensial yang Django tidak dapat saat ini ditangani.</p>\n<p>Konfigurasi utama/tiruan (mengacu pada sebagai master/slave oleh beberapa basisdata) digambarkan juga cacat -- itu tidak menyediakan pemecahan apapun untuk menangani tiruan ketinggalan (yaitu permintaan ketidakkonsekuen diperkenalkan karena dari waktu diambil untuk menulis untuk disebarkan ke tiruan). Itu juga tidak mempertimbangkan timbal balik dari transaksi dengan strategi penggunaan basisdata.</p>\n</aside>\n<p>Jadi -  apa ini artinya dalam praktik? Mari kita pertimbangkan konfigurasi contoh lain. Satu ini akan mempunyai beberapa basisdata: satu untuk aplikasi <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code>, dan semua aplikasi lain menggunakan setelah utama/tiruan dengan duatiruan baca. Ini adalah pengaturan menentukan basisdata 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=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{},</span>\n    <span class=\"s1\">&#39;auth_db&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;auth_db_name&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.mysql&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;mysql_user&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PASSWORD&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;swordfish&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;primary&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;primary_name&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.mysql&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;mysql_user&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PASSWORD&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;spam&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;replica1&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;replica1_name&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.mysql&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;mysql_user&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PASSWORD&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;eggs&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n    <span class=\"s1\">&#39;replica2&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;replica2_name&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.mysql&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;mysql_user&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PASSWORD&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;bacon&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Now we'll need to handle routing. First we want a router that knows to\nsend queries for the <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">contenttypes</span></code> apps to <code class=\"docutils literal notranslate\"><span class=\"pre\">auth_db</span></code>\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code> models are linked to <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code>, so they must be stored in the\nsame database):</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\">AuthRouter</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A router to control all database operations on models in the</span>\n<span class=\"sd\">    auth and contenttypes applications.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">route_app_labels</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;auth&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;contenttypes&#39;</span><span class=\"p\">}</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_for_read</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Attempts to read auth and contenttypes models go to auth_db.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">app_label</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">route_app_labels</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;auth_db&#39;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_for_write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Attempts to write auth and contenttypes models go to auth_db.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">app_label</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">route_app_labels</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;auth_db&#39;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">allow_relation</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj1</span><span class=\"p\">,</span> <span class=\"n\">obj2</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Allow relations if a model in the auth or contenttypes apps is</span>\n<span class=\"sd\">        involved.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> <span class=\"p\">(</span>\n            <span class=\"n\">obj1</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">app_label</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">route_app_labels</span> <span class=\"ow\">or</span>\n            <span class=\"n\">obj2</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">app_label</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">route_app_labels</span>\n        <span class=\"p\">):</span>\n           <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">allow_migrate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">db</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">model_name</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Make sure the auth and contenttypes apps only appear in the</span>\n<span class=\"sd\">        &#39;auth_db&#39; database.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> <span class=\"n\">app_label</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">route_app_labels</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">db</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;auth_db&#39;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<p>Dan kami juga ingin sebuah perute yang mengirim semua aplikasi lain semua ke konfigurasi utama/tiruan, dan secara acak memilih sebuah tiruan untuk dibaca:</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\">import</span><span class=\"w\"> </span><span class=\"nn\">random</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PrimaryReplicaRouter</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_for_read</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Reads go to a randomly-chosen replica.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">return</span> <span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">choice</span><span class=\"p\">([</span><span class=\"s1\">&#39;replica1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;replica2&#39;</span><span class=\"p\">])</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_for_write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Writes always go to primary.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;primary&#39;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">allow_relation</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj1</span><span class=\"p\">,</span> <span class=\"n\">obj2</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Relations between objects are allowed if both objects are</span>\n<span class=\"sd\">        in the primary/replica pool.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"n\">db_set</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;primary&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;replica1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;replica2&#39;</span><span class=\"p\">}</span>\n        <span class=\"k\">if</span> <span class=\"n\">obj1</span><span class=\"o\">.</span><span class=\"n\">_state</span><span class=\"o\">.</span><span class=\"n\">db</span> <span class=\"ow\">in</span> <span class=\"n\">db_set</span> <span class=\"ow\">and</span> <span class=\"n\">obj2</span><span class=\"o\">.</span><span class=\"n\">_state</span><span class=\"o\">.</span><span class=\"n\">db</span> <span class=\"ow\">in</span> <span class=\"n\">db_set</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">allow_migrate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">db</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">model_name</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        All non-auth models end up in this pool.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>Akhirnya, dalam berkas pengaturan, kami menambahkan berikut (mengganti <code class=\"docutils literal notranslate\"><span class=\"pre\">path.to.</span></code> dengan jalur Python sebenarnya pada modul dimana perute ditentukan):</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\">DATABASE_ROUTERS</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;path.to.AuthRouter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;path.to.PrimaryReplicaRouter&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Urutan dimana perute diolah adalah penting. Perute akan diminta agar mereka didaftarkan dalam pengaturan <a class=\"reference internal\" href=\"/id/4.0/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASE_ROUTERS</span></code></a>. Dalam contoh ini, <code class=\"docutils literal notranslate\"><span class=\"pre\">AuthRouter</span></code> diolah sebelum <code class=\"docutils literal notranslate\"><span class=\"pre\">PrimaryReplicaRouter</span></code>, dan sebagai hasil, keputusan tentang model-model dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code> diolah sebelum keputusan lain apapun dibuat. Jika pengaturan  <a class=\"reference internal\" href=\"/id/4.0/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASE_ROUTERS</span></code></a> mendaftarkan dua perute dalam urutan lain, <code class=\"docutils literal notranslate\"><span class=\"pre\">PrimaryReplicaRouter.allow_migrate()</span></code> akan diolah dahulu. Tangkap-semua alami dari penerapan PrimaryReplicaRouter akan berarti bahwa semua model-model akan tersedia pada semua basisdata.</p>\n<p>With this setup installed, and all databases migrated as per\n<a class=\"reference internal\" href=\"#synchronizing-multiple-databases\"><span class=\"std std-ref\">Sinkronisasi basisdata anda</span></a>, lets run some Django 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=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This retrieval will be performed on the &#39;auth_db&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">fred</span> <span class=\"o\">=</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s1\">&#39;fred&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">fred</span><span class=\"o\">.</span><span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Frederick&#39;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This save will also be directed to &#39;auth_db&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">fred</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># These retrieval will be randomly allocated to a replica database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">dna</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Douglas Adams&#39;</span><span class=\"p\">)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># A new object has no database allocation when created</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">mh</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s1\">&#39;Mostly Harmless&#39;</span><span class=\"p\">)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This assignment will consult the router, and set mh onto</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># the same database as the author object</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">mh</span><span class=\"o\">.</span><span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">dna</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This save will force the &#39;mh&#39; instance onto the primary database...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">mh</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># ... but if we re-retrieve the object, it will come back on a replica</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">mh</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s1\">&#39;Mostly Harmless&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Contoh ini menentukan sebuah perute untuk menangani interaksi dengan model-model dari aplikasi <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code>, dan perute lain untuk mengangani interaksi dengan semua aplikasi lain. Jika anda membiarkan basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> anda kosong dan tidak ingin menentukan perute basisdata tangkap-semua untuk mengangani semua aplikasi tidak sebaliknya ditentukan, perute anda harus menangani nama-nama dari semua aplikasi dalam <a class=\"reference internal\" href=\"/id/4.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> sebelum anda berpindah. Lihat <a class=\"reference internal\" href=\"#contrib-app-multiple-databases\"><span class=\"std std-ref\">Perilaku dari aplikasi bantuan</span></a> untuk informasi tentang apliaksi bantuan yang harus bersama-sama dalam satu basisdata.</p>\n</section>\n</section>\n<section id=\"manually-selecting-a-database\">\n<h2>Manual memilih basisdata<a class=\"heading-anchor\" href=\"#manually-selecting-a-database\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django juga menyediakan sebuah API yang mengizinkan anda merawat kendali lengkap terhadap penggunaan basisdata dalam kode anda. Peruntukan basisdata ditentukan manual terhadap basisdata diperuntukkan oleh sebuah perute.</p>\n<section id=\"manually-selecting-a-database-for-a-queryset\">\n<h3>Secara manual memilih basisdata untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#manually-selecting-a-database-for-a-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You can select the database for a <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> at any point in the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> &quot;chain.&quot; Call <code class=\"docutils literal notranslate\"><span class=\"pre\">using()</span></code> on the <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> to get another\n<code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> that uses the specified database.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">using()</span></code> mengambil argumen tunggal: nama lain dari basisdata pada dimana anda ingin menjalankan permintaan. 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=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This will run on the &#39;default&#39; database.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># So will this.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s1\">&#39;default&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This will run on the &#39;other&#39; database.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s1\">&#39;other&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"selecting-a-database-for-save\">\n<h3>Memilih basisdata untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code><a class=\"heading-anchor\" href=\"#selecting-a-database-for-save\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Gunakan kata kunci <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> pada <code class=\"docutils literal notranslate\"><span class=\"pre\">Model.save()</span></code> untuk menentukan pada basisdata mana data harus disimpan.</p>\n<p>Sebagai contoh, untuk menyimpan sebuah obyek pada basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">legacy_users</span></code>, anda akan menggunakan 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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">my_object</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"s1\">&#39;legacy_users&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Jika anda tidak menentukan <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code>, metode <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> kan menyimpan kedalam basisdata awalan ditempatkan oleh perute.</p>\n<section id=\"moving-an-object-from-one-database-to-another\">\n<h4>Memindahkan sebuah obyek dari satu basisdata ke lainnya<a class=\"heading-anchor\" href=\"#moving-an-object-from-one-database-to-another\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Jika anda menyimpan sebuah instance pada satu basisdata, itu mungkin menggoda untuk menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">save(using=...)</span></code> sebagai sebuah cara berpindah instance ke basisdata baru. Bagaimanapun, jika anda tidak mengambil langkah-langkah yang sesuai, ini dapat memiliki beberapa konsekuensi tidak diharapkan.</p>\n<p>Pertimbangkan contoh berikut</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=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"s1\">&#39;first&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># (statement 1)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"s1\">&#39;second&#39;</span><span class=\"p\">)</span> <span class=\"c1\"># (statement 2)</span>\n</code></pre></div>\n<p>Dalam pernyataan 1, sebuah obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> baru disimpan ke basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">first</span></code>. Pada saat ini, <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code> tidak memiliki primary key, jadi Django menerbitkan sebuah pernyataan SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code>. Ini membuat sebuah primary key, dan Django memberikan primary key itu ke <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code>.</p>\n<p>Ketika penyimpanan muncul dalam pernyataan 2, <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code> sudah mempunyai nilai primary key, dan Django akan berusaha menggunakan primary key itu pada basisdata baru. Jika nilai primary key tidak digunakan dalam basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">second</span></code>, kemudian akdan tidak mempunyai masalah apapun -- obyek akan disalin ke basisdata baru.</p>\n<p>Bagaimanapun, jika primary key dari <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code> sudah digunakan pada basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">second</span></code>, obyek yang ada dalam basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">second</span></code> akan ditimpan ketika <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code> disimpan.</p>\n<p>Anda dapat menghindari ini dalam dua cara. Pertama, anda dapat membersihkan primary key dari instance. Jika sebuah obyek tidak mempunyai primary key, Django akan memperlakukan itu sebagai sebuah obyek baru, menghindari kehilangan dari data pada basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">second</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"s1\">&#39;first&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">pk</span> <span class=\"o\">=</span> <span class=\"kc\">None</span> <span class=\"c1\"># Clear the primary key.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"s1\">&#39;second&#39;</span><span class=\"p\">)</span> <span class=\"c1\"># Write a completely new object.</span>\n</code></pre></div>\n<p>Pilihan kedua adalah menggunakan pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">force_insert</span></code> pada <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> untuk memastikan Django melakukan <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code> SQL:</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=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"s1\">&#39;first&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"s1\">&#39;second&#39;</span><span class=\"p\">,</span> <span class=\"n\">force_insert</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ini akan memastikan bahwa seseorang bernama <code class=\"docutils literal notranslate\"><span class=\"pre\">Fred</span></code> akan mempunyai primary key sama pada kedua basisdata. Jika primary key sudah digunakan ketika anda mencoba menyimpan kedalam basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">kedua</span></code>, sebuah kesalahan akan dimunculkan.</p>\n</section>\n</section>\n<section id=\"selecting-a-database-to-delete-from\">\n<h3>Memilih basisdata untuk menghapus dari<a class=\"heading-anchor\" href=\"#selecting-a-database-to-delete-from\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Secara awalan, sebuah panggilan untuk menghapus obyek yang ada akan dijalankan pada basisdata sama yang digunakan untuk mengambil obyek dalam tempat pertama:</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=\"n\">u</span> <span class=\"o\">=</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s1\">&#39;legacy_users&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s1\">&#39;fred&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">u</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span> <span class=\"c1\"># will delete from the `legacy_users` database</span>\n</code></pre></div>\n<p>Untuk menentukan basisdata dari model mana akan dihapus, lewatkan sebuah argumen kata kunci <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> pada metode <code class=\"docutils literal notranslate\"><span class=\"pre\">Model.delete()</span></code>. Argumen ini bekerja seperti argumen kata kunci <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> pada <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>.</p>\n<p>Sebagai contoh, jika anda sedang memindahkan pengguna dari basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">legacy_users</span></code> ke basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">new_users</span></code>, anda mungkin menggunakan perintah-perintah 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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">user_obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"s1\">&#39;new_users&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">user_obj</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"s1\">&#39;legacy_users&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"using-managers-with-multiple-databases\">\n<h3>Menggunakan pengelola dengan banyak basisdata<a class=\"heading-anchor\" href=\"#using-managers-with-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Gunakan metode <code class=\"docutils literal notranslate\"><span class=\"pre\">db_manager()</span></code> pada pengelola untuk memberikan pengelola mengakses ke basisdata bukan-awalan.</p>\n<p>Sebagai contoh, katakan anda mempunyai metode pengelolaan penyesuaian yang menyentuh basisdata -- <code class=\"docutils literal notranslate\"><span class=\"pre\">User.objects.create_user()</span></code>. Karena <code class=\"docutils literal notranslate\"><span class=\"pre\">create_user()</span></code> adalah metode pengelola, bukan metode <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, anda tidak dapat melakukan <code class=\"docutils literal notranslate\"><span class=\"pre\">User.objects.using('new_users').create_user()</span></code>. (Metode <code class=\"docutils literal notranslate\"><span class=\"pre\">create_user()</span></code> hanya tersedia pada <code class=\"docutils literal notranslate\"><span class=\"pre\">User.objects</span></code>, pengelola, bukan pada obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> diturunkan dari pengelola.) Pemecahannya adalah menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">db_manager()</span></code>, seperti 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=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">db_manager</span><span class=\"p\">(</span><span class=\"s1\">&#39;new_users&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">create_user</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">db_manager()</span></code> mengembalikan sebuah salinan dari ikatan pengelola pada basisdata anda tentukan.</p>\n<section id=\"using-get-queryset-with-multiple-databases\">\n<h4>Menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> dengan basisdata banyak<a class=\"heading-anchor\" href=\"#using-get-queryset-with-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Jika anda menimpa <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset()</span></code> pada pengelola anda, apstikan untuk antara memanggil metode pada induk (menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">super()</span></code>) atau melakukan penanganan sesuai dari atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">_db</span></code> pada pengelola (sebuah string mengandung nama dari basisdata untuk digunakan).</p>\n<p>Sebagai contoh, jika anda ingin mengembalikan penyesuaian kelas <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dari metode <code class=\"docutils literal notranslate\"><span class=\"pre\">get_queryset</span></code>, anda dapat melakukan 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\">MyManager</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=\"n\">qs</span> <span class=\"o\">=</span> <span class=\"n\">CustomQuerySet</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_db</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"n\">qs</span> <span class=\"o\">=</span> <span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_db</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">qs</span>\n</code></pre></div>\n</section>\n</section>\n</section>\n<section id=\"exposing-multiple-databases-in-django-s-admin-interface\">\n<h2>Memamerkan basisdata banyak di antarmuka admin Django<a class=\"heading-anchor\" href=\"#exposing-multiple-databases-in-django-s-admin-interface\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Admin Django tidak mempunyai dukungan jelas untuk banyak basisdata. Jika anda ingin menyediakan sebuah antarmuka admin untuk sebuah model pada sebuah basisdata daripada selain ditentukan oleh rantai peute anda, anda akan butuh menulis kelas-kelas <a class=\"reference internal\" href=\"/id/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> penyesuaian yang akan langsung ke admin untuk menggunakan basisdata khusus untuk isi.</p>\n<p>Obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code> mempunyai lima metode yang membutuhkan penyesuaian untuk dukungan banyak-basisdata:</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\">MultiDBModelAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"c1\"># A handy constant for the name of the alternate database.</span>\n    <span class=\"n\">using</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;other&#39;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">save_model</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"p\">,</span> <span class=\"n\">change</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to save objects to the &#39;other&#39; database.</span>\n        <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</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\">using</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">delete_model</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to delete objects from the &#39;other&#39; database</span>\n        <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">delete</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\">using</span><span class=\"p\">)</span>\n\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> <span class=\"n\">request</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to look for objects on the &#39;other&#39; database.</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=\"n\">request</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">formfield_for_foreignkey</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">db_field</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to populate ForeignKey widgets using a query</span>\n        <span class=\"c1\"># on the &#39;other&#39; database.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">formfield_for_foreignkey</span><span class=\"p\">(</span><span class=\"n\">db_field</span><span class=\"p\">,</span> <span class=\"n\">request</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\">using</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">formfield_for_manytomany</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">db_field</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to populate ManyToMany widgets using a query</span>\n        <span class=\"c1\"># on the &#39;other&#39; database.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">formfield_for_manytomany</span><span class=\"p\">(</span><span class=\"n\">db_field</span><span class=\"p\">,</span> <span class=\"n\">request</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\">using</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Penerapan disediakan disini menerapkan strategi banyak-basisdata dimana semua obyek dari jenis yang diberikan disimpan pada basisdata khusus (sebagai contoh, semua obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> dalam basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">lain</span></code>). Jika penggunaan anda dari banyak basisdata lebih rumit, <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code> anda akan butuh mencerminkan strategi itu.</p>\n<p>Obyek <a class=\"reference internal\" href=\"/id/4.0/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">InlineModelAdmin</span></code></a> dapat ditangani di gaya yang mirip. Mereka membutuhkan tiga metode 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\">MultiDBTabularInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">TabularInline</span><span class=\"p\">):</span>\n    <span class=\"n\">using</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;other&#39;</span>\n\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> <span class=\"n\">request</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to look for inline objects on the &#39;other&#39; database.</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=\"n\">request</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">formfield_for_foreignkey</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">db_field</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to populate ForeignKey widgets using a query</span>\n        <span class=\"c1\"># on the &#39;other&#39; database.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">formfield_for_foreignkey</span><span class=\"p\">(</span><span class=\"n\">db_field</span><span class=\"p\">,</span> <span class=\"n\">request</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\">using</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">formfield_for_manytomany</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">db_field</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to populate ManyToMany widgets using a query</span>\n        <span class=\"c1\"># on the &#39;other&#39; database.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">formfield_for_manytomany</span><span class=\"p\">(</span><span class=\"n\">db_field</span><span class=\"p\">,</span> <span class=\"n\">request</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\">using</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Sekali anda telah menulis pengertian admin model anda, mereka dapat didaftarkan dengan instance <code class=\"docutils literal notranslate\"><span class=\"pre\">Admin</span></code> apapun:</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.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"c1\"># Specialize the multi-db admin objects for use with specific models.</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookInline</span><span class=\"p\">(</span><span class=\"n\">MultiDBTabularInline</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Book</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PublisherAdmin</span><span class=\"p\">(</span><span class=\"n\">MultiDBModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">inlines</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">BookInline</span><span class=\"p\">]</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">MultiDBModelAdmin</span><span class=\"p\">)</span>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Publisher</span><span class=\"p\">,</span> <span class=\"n\">PublisherAdmin</span><span class=\"p\">)</span>\n\n<span class=\"n\">othersite</span> <span class=\"o\">=</span> <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">AdminSite</span><span class=\"p\">(</span><span class=\"s1\">&#39;othersite&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">othersite</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Publisher</span><span class=\"p\">,</span> <span class=\"n\">MultiDBModelAdmin</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Contoh ini menyetel dua situs admin. Pada situs pertama, obyek-obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">Publisher</span></code> dibuka; obyek-obyek <code class=\"docutils literal notranslate\"><span class=\"pre\">Publisher</span></code> mempunyai sebuah dibarisan datar menunjukkan buku-buku diterbitkan oleh penerbit. Situs kedua membuka hanya penerbit, tanpa barisan.</p>\n</section>\n<section id=\"using-raw-cursors-with-multiple-databases\">\n<h2>Menggunakan kursor mentah dengan banyak basisdata<a class=\"heading-anchor\" href=\"#using-raw-cursors-with-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Jika anda menggunakan lebih dari satu basisdata anda dapat menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connections</span></code> untuk mengambil hubungan (dan kursor) untuk basisdata tertentu. <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connections</span></code> adalah objek seperti-kamus yang mengizinkan anda mengambil hubungan tertentu menggunakan nama lainnya:</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\">connections</span>\n<span class=\"k\">with</span> <span class=\"n\">connections</span><span class=\"p\">[</span><span class=\"s1\">&#39;my_db_alias&#39;</span><span class=\"p\">]</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=\"o\">...</span>\n</code></pre></div>\n</section>\n<section id=\"limitations-of-multiple-databases\">\n<h2>Batasan dari banyak basisdata<a class=\"heading-anchor\" href=\"#limitations-of-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"cross-database-relations\">\n<span id=\"no-cross-database-relations\"></span><h3>Hubungan lintas-basisdata<a class=\"heading-anchor\" href=\"#cross-database-relations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django saat ini tidak menyediakan dukungan apapun untuk foreign key atau hubungan many-to-many menjangkau banyak basisdata. Jika anda telah menggunakan sebuah perute pada model sebagian ke basisdata berbeda, foreign key apapun dan hubungan many-to-many ditentukan oleh modek-model tersebut harus secara internal pada basisdata tunggal.</p>\n<p>Ini karena dari kesatuan referensial. Untuk merawat hubungan diantara dua obyek, Django butuh mengetahui bahwa primary key dari obyek terkait adalah sah. Jika primary key disimpan pada basisdata terpisah, itu tidak mungkin dengan mudah menilai keabsahan primary key.</p>\n<p>Jika anda sedang menggunakan Postgres, Oracle, atau MySQL dengan InnoDB, ini dipaksa pada tingkat kesatuan basisdata -- batasan kunci tingkatan basisdata mencegah dari pembuatan dari hubungan yang tidak dapat disahkan.</p>\n<p>Bagaimanapun, jika anda sedang menggunakan SQLite atay MySQL dengan tabel MyISAM, tidak ada pemaksaan kesatuan referensial; sebagai hasil, anda mungkin dapat me 'niru' foreign key basisdata. bagaimanapun, konfigurasi ini tidak secara resmi didukung oleh Django.</p>\n</section>\n<section id=\"behavior-of-contrib-apps\">\n<span id=\"contrib-app-multiple-databases\"></span><h3>Perilaku dari aplikasi bantuan<a class=\"heading-anchor\" href=\"#behavior-of-contrib-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Beberapa aplikasi bantuan termasuk model-model, dan beberapa aplikasi bergantung pada lainnya. Sejak hubungan silang-basisdata tidak dimungkinkan, ini membuat beberapa pembatasan pada bagaimana anda dapat memisahkan model-model ini terhadap basisdata:</p>\n<ul class=\"simple\">\n<li><p>setiap satu dari <code class=\"docutils literal notranslate\"><span class=\"pre\">contenttypes.ContentType</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">sessions.Session</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">sites.Site</span></code> dapat disimpan dalam basisdata apapun, diberikan perute yang cocok.</p></li>\n<li><p>Model-model <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code> — <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">Group</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">Permission</span></code> — dikaitkan bersama-sama dan dikaitkan pada <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code>, sehingga mereka harus disimpan dalam basisdata sama sebagai <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> bergantung pada <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code>, jadi modelnya harus di basisdata sama seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">flatpages</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">redirects</span></code> bergantung pada <code class=\"docutils literal notranslate\"><span class=\"pre\">sites</span></code>,jadi model-model mereka harus di basisdata yang sama seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">sites</span></code>.</p></li>\n</ul>\n<p>Sebagai tambahan, beberapa obyek otomatis dibuat hanya setelah <a class=\"reference internal\" href=\"/id/4.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> membuat tabel untuk menahan mereka dalam basisdata:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Site</span></code> awal,</p></li>\n<li><p>sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code> untuk setiap model (termasuk itu tidak disimpan di basisdata itu),</p></li>\n<li><p>the <code class=\"docutils literal notranslate\"><span class=\"pre\">Permission</span></code>s for each model (including those not stored in that\ndatabase).</p></li>\n</ul>\n<p>Untuk pengaturan umum dengan banyak basisdata, itu tidak berguna memiliki obyek-obyek ini dalam lebih dari satu basisdata. Pengaturan umum menyertakan utama/tiruan dan menghubungkan ke basisdata luar. Karena itu, itu dianjurkan untuk menulis <span class=\"xref std std-ref\">database router1</span> yang mengizinkan mensinkronkan ketiga model ini pada hanya satu basisdata. Gunakan pendekatan sama untuk aplikasi bantuan dan pihak-ketiga yang tidak butuh tabel mereka dalam banyak basisdata.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>Jika anda sedang mensinkronkan jenis-jenis isi ke lebih dari satu basisdata, waspada bahwa primary key mereka mungkin tidak cocok terhadap basisdata. Ini mungkin menghasilkan kerusakan data atau kehilangan data.</p>\n</aside>\n</section>\n</section>","rootId":"multiple-databases","toc":[{"title":"Menentukan basisdata anda","anchor":"defining-your-databases","children":[]},{"title":"Sinkronisasi basisdata anda","anchor":"synchronizing-your-databases","children":[{"title":"Menggunakan perintah pengelolaan lain","anchor":"using-other-management-commands","children":[]}]},{"title":"Perute basisdata otomatis","anchor":"automatic-database-routing","children":[{"title":"Router basisdata","anchor":"database-routers","children":[{"title":"Petunjuk","anchor":"hints","children":[]}]},{"title":"Menggunakan router","anchor":"using-routers","children":[]},{"title":"Sebuah contoh","anchor":"an-example","children":[]}]},{"title":"Manual memilih basisdata","anchor":"manually-selecting-a-database","children":[{"title":"Secara manual memilih basisdata untuk QuerySet","anchor":"manually-selecting-a-database-for-a-queryset","children":[]},{"title":"Memilih basisdata untuk save()","anchor":"selecting-a-database-for-save","children":[{"title":"Memindahkan sebuah obyek dari satu basisdata ke lainnya","anchor":"moving-an-object-from-one-database-to-another","children":[]}]},{"title":"Memilih basisdata untuk menghapus dari","anchor":"selecting-a-database-to-delete-from","children":[]},{"title":"Menggunakan pengelola dengan banyak basisdata","anchor":"using-managers-with-multiple-databases","children":[{"title":"Menggunakan get_queryset() dengan basisdata banyak","anchor":"using-get-queryset-with-multiple-databases","children":[]}]}]},{"title":"Memamerkan basisdata banyak di antarmuka admin Django","anchor":"exposing-multiple-databases-in-django-s-admin-interface","children":[]},{"title":"Menggunakan kursor mentah dengan banyak basisdata","anchor":"using-raw-cursors-with-multiple-databases","children":[]},{"title":"Batasan dari banyak basisdata","anchor":"limitations-of-multiple-databases","children":[{"title":"Hubungan lintas-basisdata","anchor":"cross-database-relations","children":[]},{"title":"Perilaku dari aplikasi bantuan","anchor":"behavior-of-contrib-apps","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/4.0/topics/"},{"docname":"topics/db/index","title":"Model dan basisdata","url":"/id/4.0/topics/db/"}],"prev":{"docname":"topics/db/transactions","title":"Transaksi basisdata","url":"/id/4.0/topics/db/transactions/"},"next":{"docname":"topics/db/tablespaces","title":"Tablespaces","url":"/id/4.0/topics/db/tablespaces/"},"formats":{"html":"/id/4.0/topics/db/multi-db/","markdown":"/id/4.0/topics/db/multi-db.md","json":"/id/4.0/topics/db/multi-db.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/topics/db/multi-db.txt","official":"https://docs.djangoproject.com/id/4.0/topics/db/multi-db/","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"]}