{"title":"Basisdata banyak","version":"1.10","locale":"id","docname":"topics/db/multi-db","url":"/id/1.10/topics/db/multi-db/","canonical":"https://djangodocs.dev/id/1.10/topics/db/multi-db/","summary":"This topic guide describes Django's support for interacting with multiple databases.","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>This topic guide describes Django's support for interacting with\nmultiple databases. Most of the rest of Django's documentation assumes\nyou are interacting with a single database. If you want to interact\nwith multiple databases, you'll need to take some additional steps.</p>\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/1.10/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</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/1.10/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a>.</p>\n<p>Databases can have any alias you choose. However, the alias\n<code class=\"docutils literal notranslate\">default</code> has special significance. Django uses the database with\nthe alias of <code class=\"docutils literal notranslate\">default</code> when no other database has been selected.</p>\n<p>The following is an example <code class=\"docutils literal notranslate\">settings.py</code> snippet defining two\ndatabases -- a default PostgreSQL database and a MySQL database called\n<code class=\"docutils literal notranslate\">users</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>DATABASES <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>If the concept of a <code class=\"docutils literal notranslate\">default</code> database doesn't make sense in the context\nof your project, you need to be careful to always specify the database\nthat you want to use. Django requires that a <code class=\"docutils literal notranslate\">default</code> database entry\nbe defined, but the parameters dictionary can be left blank if it will not be\nused. To do this, you must set up <a class=\"reference internal\" href=\"/id/1.10/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASE_ROUTERS</code></a> for all of your\napps' models, including those in any contrib and third-party apps you're using,\nso that no queries are routed to the default database. The following is an\nexample <code class=\"docutils literal notranslate\">settings.py</code> snippet defining two non-default databases, with the\n<code class=\"docutils literal notranslate\">default</code> entry intentionally left empty:</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>DATABASES <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/1.10/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a> setting, Django will raise a\n<code class=\"docutils literal notranslate\">django.db.utils.ConnectionDoesNotExist</code> exception.</p>\n</section>\n<section id=\"synchronizing-your-databases\">\n<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>The <a class=\"reference internal\" href=\"/id/1.10/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> management command operates on one database at a\ntime. By default, it operates on the <code class=\"docutils literal notranslate\">default</code> database, but by\nproviding the <a class=\"reference internal\" href=\"/id/1.10/ref/django-admin/#cmdoption-migrate-database\"><code class=\"xref std std-option docutils literal notranslate\">--database</code></a> option, you can tell it\nto synchronize a different database. So, to synchronize all models onto\nall databases in the first example above, you would need to call:</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>If you don't want every application to be synchronized onto a\nparticular database, you can define a <a class=\"reference internal\" href=\"#topics-db-multi-db-routing\"><span class=\"std std-ref\">database\nrouter</span></a> that implements a policy\nconstraining the availability of particular models.</p>\n<p>If, as in the second example above, you've left the <code class=\"docutils literal notranslate\">default</code> database empty,\nyou must provide a database name each time you run <a class=\"reference internal\" href=\"/id/1.10/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a>. Omitting\nthe database name would raise an error. For the second example:</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>Using other management commands<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>Most other <code class=\"docutils literal notranslate\">django-admin</code> commands that interact with the database operate in\nthe same way as <a class=\"reference internal\" href=\"/id/1.10/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> -- they only ever operate on one database at\na time, using <code class=\"docutils literal notranslate\">--database</code> to control the database used.</p>\n<p>Sebuah pengecualian pada aturan ini adalah perintah <a class=\"reference internal\" href=\"/id/1.10/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</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\">default</code>, tetapi itu merundingkan metode <a class=\"reference internal\" href=\"#allow_migrate\" title=\"allow_migrate\"><code class=\"xref py py-meth docutils literal notranslate\">allow_migrate()</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<aside class=\"version-note version-changed\" data-version=\"1.10\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.10</p><p>Migration consistency checks were added. Checks based on database routers\nwere added in 1.10.1.</p>\n</aside>\n</section>\n</section>\n<section id=\"automatic-database-routing\">\n<span id=\"topics-db-multi-db-routing\"></span><h2>Automatic database routing<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>The easiest way to use multiple databases is to set up a database\nrouting scheme. The default routing scheme ensures that objects remain\n'sticky' to their original database (i.e., an object retrieved from\nthe <code class=\"docutils literal notranslate\">foo</code> database will be saved on the same database). The default\nrouting scheme ensures that if a database isn't specified, all queries\nfall back to the <code class=\"docutils literal notranslate\">default</code> database.</p>\n<p>You don't have to do anything to activate the default routing scheme\n-- it is provided 'out of the box' on every Django project. However,\nif you want to implement more interesting database allocation\nbehaviors, you can define and install your own database routers.</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\">db_for_read</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model</em>, <em class=\"sig-param\"><span class=\"o\">**</span>hints</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>Suggest the database that should be used for read operations for\nobjects of type <code class=\"docutils literal notranslate\">model</code>.</p>\n<p>If a database operation is able to provide any additional\ninformation that might assist in selecting a database, it will be\nprovided in the <code class=\"docutils literal notranslate\">hints</code> dictionary. Details on valid hints are\nprovided <a class=\"reference internal\" href=\"#topics-db-multi-db-hints\"><span class=\"std std-ref\">below</span></a>.</p>\n<p>Mengembalikan <code class=\"docutils literal notranslate\">None</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\">db_for_write</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model</em>, <em class=\"sig-param\"><span class=\"o\">**</span>hints</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>Suggest the database that should be used for writes of objects of\ntype Model.</p>\n<p>If a database operation is able to provide any additional\ninformation that might assist in selecting a database, it will be\nprovided in the <code class=\"docutils literal notranslate\">hints</code> dictionary. Details on valid hints are\nprovided <a class=\"reference internal\" href=\"#topics-db-multi-db-hints\"><span class=\"std std-ref\">below</span></a>.</p>\n<p>Mengembalikan <code class=\"docutils literal notranslate\">None</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\">allow_relation</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">obj1</em>, <em class=\"sig-param\">obj2</em>, <em class=\"sig-param\"><span class=\"o\">**</span>hints</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\">True</code> jika sebuah hubungan diantara <code class=\"docutils literal notranslate\">obj1</code> dan <code class=\"docutils literal notranslate\">obj2</code> harus diizinkan, <code class=\"docutils literal notranslate\">False</code> jika hubungan harus dicegah, atau <code class=\"docutils literal notranslate\">None</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</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"allow_migrate\">\n<span class=\"sig-name descname\">allow_migrate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">db</em>, <em class=\"sig-param\">app_label</em>, <em class=\"sig-param\">model_name<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>hints</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>Determine if the migration operation is allowed to run on the database with\nalias <code class=\"docutils literal notranslate\">db</code>. Return <code class=\"docutils literal notranslate\">True</code> if the operation should run, <code class=\"docutils literal notranslate\">False</code> if it\nshouldn't run, or <code class=\"docutils literal notranslate\">None</code> if the router has no opinion.</p>\n<p>The <code class=\"docutils literal notranslate\">app_label</code> positional argument is the label of the application\nbeing migrated.</p>\n<p><code class=\"docutils literal notranslate\">model_name</code> is set by most migration operations to the value of\n<code class=\"docutils literal notranslate\">model._meta.model_name</code> (the lowercased version of the model\n<code class=\"docutils literal notranslate\">__name__</code>) of the model being migrated. Its value is <code class=\"docutils literal notranslate\">None</code> for the\n<a class=\"reference internal\" href=\"/id/1.10/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a> and\n<a class=\"reference internal\" href=\"/id/1.10/ref/migration-operations/#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\">RunSQL</code></a> operations unless they\nprovide it using hints.</p>\n<p><code class=\"docutils literal notranslate\">hints</code> are used by certain operations to communicate additional\ninformation to the router.</p>\n<p>When <code class=\"docutils literal notranslate\">model_name</code> is set, <code class=\"docutils literal notranslate\">hints</code> normally contains the model class\nunder the key <code class=\"docutils literal notranslate\">'model'</code>. Note that it may be a <a class=\"reference internal\" href=\"/id/1.10/topics/migrations/#historical-models\"><span class=\"std std-ref\">historical model</span></a>, and thus not have any custom attributes, methods, or\nmanagers. You should only rely on <code class=\"docutils literal notranslate\">_meta</code>.</p>\n<p>This method can also be used to determine the availability of a model on a\ngiven database.</p>\n<p><a class=\"reference internal\" href=\"/id/1.10/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> always creates migrations for model changes, but\nif <code class=\"docutils literal notranslate\">allow_migrate()</code> returns <code class=\"docutils literal notranslate\">False</code>, any migration operations for the\n<code class=\"docutils literal notranslate\">model_name</code> will be silently skipped when running <a class=\"reference internal\" href=\"/id/1.10/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> on\nthe <code class=\"docutils literal notranslate\">db</code>. Changing the behavior of <code class=\"docutils literal notranslate\">allow_migrate()</code> for models that\nalready have migrations may result in broken foreign keys, extra tables,\nor missing tables. When <a class=\"reference internal\" href=\"/id/1.10/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> verifies the migration\nhistory, it skips databases where no app is allowed to migrate.</p>\n</dd></dl>\n\n<p>A router doesn't have to provide <em>all</em> these methods -- it may omit one\nor more of them. If one of the methods is omitted, Django will skip\nthat router when performing the relevant check.</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>The hints received by the database router can be used to decide which\ndatabase should receive a given request.</p>\n<p>At present, the only hint that will be provided is <code class=\"docutils literal notranslate\">instance</code>, an\nobject instance that is related to the read or write operation that is\nunderway. This might be the instance that is being saved, or it might\nbe an instance that is being added in a many-to-many relation. In some\ncases, no instance hint will be provided at all. The router checks for\nthe existence of an instance hint, and determine if that hint should be\nused to alter routing behavior.</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>Database routers are installed using the <a class=\"reference internal\" href=\"/id/1.10/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASE_ROUTERS</code></a>\nsetting. This setting defines a list of class names, each specifying a\nrouter that should be used by the master router\n(<code class=\"docutils literal notranslate\">django.db.router</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 <code class=\"docutils literal notranslate\">_state.db</code> of the hint instance. If a hint instance wasn't\nprovided, or the instance doesn't currently have database state, the\nmaster router will allocate the <code class=\"docutils literal notranslate\">default</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\" role=\"note\">\n<p class=\"admonition-title\">Hanya bertujuan contoh!</p>\n<p>This example is intended as a demonstration of how the router\ninfrastructure can be used to alter database usage. It\nintentionally ignores some complex issues in order to\ndemonstrate how routers are used.</p>\n<p>This example won't work if any of the models in <code class=\"docutils literal notranslate\">myapp</code> contain\nrelationships to models outside of the <code class=\"docutils literal notranslate\">other</code> database.\n<a class=\"reference internal\" href=\"#no-cross-database-relations\"><span class=\"std std-ref\">Cross-database relationships</span></a>\nintroduce referential integrity problems that Django can't\ncurrently handle.</p>\n<p>The primary/replica (referred to as master/slave by some databases)\nconfiguration described is also flawed -- it\ndoesn't provide any solution for handling replication lag (i.e.,\nquery inconsistencies introduced because of the time taken for a\nwrite to propagate to the replicas). It also doesn't consider the\ninteraction of transactions with the database utilization strategy.</p>\n</aside>\n<p>So - what does this mean in practice? Let's consider another sample\nconfiguration. This one will have several databases: one for the\n<code class=\"docutils literal notranslate\">auth</code> application, and all other apps using a primary/replica setup\nwith two read replicas. Here are the settings specifying these\ndatabases:</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>DATABASES <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&#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&#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&#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&#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\">auth</code> app to <code class=\"docutils literal notranslate\">auth_db</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">AuthRouter</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n    <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 application.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">def</span> <span class=\"nf\">db_for_read</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> model<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Attempts to read auth models go to auth_db.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> model<span class=\"o\">.</span>_meta<span class=\"o\">.</span>app_label <span class=\"o\">==</span> <span class=\"s1\">&#39;auth&#39;</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=\"nf\">db_for_write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> model<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Attempts to write auth models go to auth_db.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> model<span class=\"o\">.</span>_meta<span class=\"o\">.</span>app_label <span class=\"o\">==</span> <span class=\"s1\">&#39;auth&#39;</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=\"nf\">allow_relation</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj1<span class=\"p\">,</span> obj2<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Allow relations if a model in the auth app is involved.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> obj1<span class=\"o\">.</span>_meta<span class=\"o\">.</span>app_label <span class=\"o\">==</span> <span class=\"s1\">&#39;auth&#39;</span> <span class=\"ow\">or</span> \\\n           obj2<span class=\"o\">.</span>_meta<span class=\"o\">.</span>app_label <span class=\"o\">==</span> <span class=\"s1\">&#39;auth&#39;</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=\"nf\">allow_migrate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db<span class=\"p\">,</span> app_label<span class=\"p\">,</span> model_name<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Make sure the auth app only appears in the &#39;auth_db&#39;</span>\n<span class=\"sd\">        database.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> app_label <span class=\"o\">==</span> <span class=\"s1\">&#39;auth&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> db <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>And we also want a router that sends all other apps to the\nprimary/replica configuration, and randomly chooses a replica to read\nfrom:</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=\"nn\">random</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">PrimaryReplicaRouter</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">db_for_read</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> model<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <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> random<span class=\"o\">.</span>choice<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=\"nf\">db_for_write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> model<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <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=\"nf\">allow_relation</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj1<span class=\"p\">,</span> obj2<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <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        db_list <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> obj1<span class=\"o\">.</span>_state<span class=\"o\">.</span>db <span class=\"ow\">in</span> db_list <span class=\"ow\">and</span> obj2<span class=\"o\">.</span>_state<span class=\"o\">.</span>db <span class=\"ow\">in</span> db_list<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=\"nf\">allow_migrate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db<span class=\"p\">,</span> app_label<span class=\"p\">,</span> model_name<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <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>Finally, in the settings file, we add the following (substituting\n<code class=\"docutils literal notranslate\">path.to.</code> with the actual Python path to the module(s) where the\nrouters are defined):</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>DATABASE_ROUTERS <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>The order in which routers are processed is significant. Routers will\nbe queried in the order they are listed in the\n<a class=\"reference internal\" href=\"/id/1.10/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASE_ROUTERS</code></a> setting. In this example, the\n<code class=\"docutils literal notranslate\">AuthRouter</code> is processed before the <code class=\"docutils literal notranslate\">PrimaryReplicaRouter</code>, and as a\nresult, decisions concerning the models in <code class=\"docutils literal notranslate\">auth</code> are processed\nbefore any other decision is made. If the <a class=\"reference internal\" href=\"/id/1.10/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASE_ROUTERS</code></a>\nsetting listed the two routers in the other order,\n<code class=\"docutils literal notranslate\">PrimaryReplicaRouter.allow_migrate()</code> would be processed first. The\ncatch-all nature of the PrimaryReplicaRouter implementation would mean\nthat all models would be available on all databases.</p>\n<p>Dengan pengaturan ini dipasang, mari kita jalankan beberapa kode Django:</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>fred <span class=\"o\">=</span> User<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>username<span class=\"o\">=</span><span class=\"s1\">&#39;fred&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>fred<span class=\"o\">.</span>first_name <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>fred<span class=\"o\">.</span>save<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>dna <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<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>mh <span class=\"o\">=</span> Book<span class=\"p\">(</span>title<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>mh<span class=\"o\">.</span>author <span class=\"o\">=</span> dna\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>mh<span class=\"o\">.</span>save<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>mh <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s1\">&#39;Mostly Harmless&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This example defined a router to handle interaction with models from the\n<code class=\"docutils literal notranslate\">auth</code> app, and other routers to handle interaction with all other apps. If\nyou left your <code class=\"docutils literal notranslate\">default</code> database empty and don't want to define a catch-all\ndatabase router to handle all apps not otherwise specified, your routers must\nhandle the names of all apps in <a class=\"reference internal\" href=\"/id/1.10/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> before you migrate.\nSee <a class=\"reference internal\" href=\"#contrib-app-multiple-databases\"><span class=\"std std-ref\">Perilaku dari aplikasi bantuan</span></a> for information about contrib apps\nthat must be together in one database.</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 also provides an API that allows you to maintain complete control\nover database usage in your code. A manually specified database allocation\nwill take priority over a database allocated by a router.</p>\n<section id=\"manually-selecting-a-database-for-a-queryset\">\n<h3>Secara manual memilih basisdata untuk <code class=\"docutils literal notranslate\">QuerySet</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\">QuerySet</code> at any point in the\n<code class=\"docutils literal notranslate\">QuerySet</code> &quot;chain.&quot; Just call <code class=\"docutils literal notranslate\">using()</code> on the <code class=\"docutils literal notranslate\">QuerySet</code> to get\nanother <code class=\"docutils literal notranslate\">QuerySet</code> that uses the specified database.</p>\n<p><code class=\"docutils literal notranslate\">using()</code> takes a single argument: the alias of the database on\nwhich you want to run the query. For example:</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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s1\">&#39;default&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>all<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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s1\">&#39;other&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>all<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\">save()</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>Use the <code class=\"docutils literal notranslate\">using</code> keyword to <code class=\"docutils literal notranslate\">Model.save()</code> to specify to which\ndatabase the data should be saved.</p>\n<p>For example, to save an object to the <code class=\"docutils literal notranslate\">legacy_users</code> database, you'd\nuse this:</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>my_object<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s1\">&#39;legacy_users&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>If you don't specify <code class=\"docutils literal notranslate\">using</code>, the <code class=\"docutils literal notranslate\">save()</code> method will save into\nthe default database allocated by the routers.</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>If you've saved an instance to one database, it might be tempting to\nuse <code class=\"docutils literal notranslate\">save(using=...)</code> as a way to migrate the instance to a new\ndatabase. However, if you don't take appropriate steps, this could\nhave some unexpected consequences.</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>p <span class=\"o\">=</span> Person<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<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>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<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>In statement 1, a new <code class=\"docutils literal notranslate\">Person</code> object is saved to the <code class=\"docutils literal notranslate\">first</code>\ndatabase. At this time, <code class=\"docutils literal notranslate\">p</code> doesn't have a primary key, so Django\nissues an SQL <code class=\"docutils literal notranslate\">INSERT</code> statement. This creates a primary key, and\nDjango assigns that primary key to <code class=\"docutils literal notranslate\">p</code>.</p>\n<p>When the save occurs in statement 2, <code class=\"docutils literal notranslate\">p</code> already has a primary key\nvalue, and Django will attempt to use that primary key on the new\ndatabase. If the primary key value isn't in use in the <code class=\"docutils literal notranslate\">second</code>\ndatabase, then you won't have any problems -- the object will be\ncopied to the new database.</p>\n<p>However, if the primary key of <code class=\"docutils literal notranslate\">p</code> is already in use on the\n<code class=\"docutils literal notranslate\">second</code> database, the existing object in the <code class=\"docutils literal notranslate\">second</code> database\nwill be overridden when <code class=\"docutils literal notranslate\">p</code> is saved.</p>\n<p>You can avoid this in two ways. First, you can clear the primary key\nof the instance. If an object has no primary key, Django will treat it\nas a new object, avoiding any loss of data on the <code class=\"docutils literal notranslate\">second</code>\ndatabase:</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>p <span class=\"o\">=</span> Person<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s1\">&#39;first&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>pk <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>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<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>The second option is to use the <code class=\"docutils literal notranslate\">force_insert</code> option to <code class=\"docutils literal notranslate\">save()</code>\nto ensure that Django does an SQL <code class=\"docutils literal notranslate\">INSERT</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>p <span class=\"o\">=</span> Person<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s1\">&#39;first&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s1\">&#39;second&#39;</span><span class=\"p\">,</span> force_insert<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This will ensure that the person named <code class=\"docutils literal notranslate\">Fred</code> will have the same\nprimary key on both databases. If that primary key is already in use\nwhen you try to save onto the <code class=\"docutils literal notranslate\">second</code> database, an error will be\nraised.</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>By default, a call to delete an existing object will be executed on\nthe same database that was used to retrieve the object in the first\nplace:</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>u <span class=\"o\">=</span> User<span class=\"o\">.</span>objects<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s1\">&#39;legacy_users&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>get<span class=\"p\">(</span>username<span class=\"o\">=</span><span class=\"s1\">&#39;fred&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>u<span class=\"o\">.</span>delete<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\">using</code> pada metode <code class=\"docutils literal notranslate\">Model.delete()</code>. Argumen ini bekerja seperti argumen kata kunci <code class=\"docutils literal notranslate\">using</code> pada <code class=\"docutils literal notranslate\">save()</code>.</p>\n<p>Sebagai contoh, jika anda sedang memindahkan pengguna dari basisdata <code class=\"docutils literal notranslate\">legacy_users</code> ke basisdata <code class=\"docutils literal notranslate\">new_users</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>user_obj<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s1\">&#39;new_users&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>user_obj<span class=\"o\">.</span>delete<span class=\"p\">(</span>using<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>Use the <code class=\"docutils literal notranslate\">db_manager()</code> method on managers to give managers access to\na non-default database.</p>\n<p>For example, say you have a custom manager method that touches the\ndatabase -- <code class=\"docutils literal notranslate\">User.objects.create_user()</code>. Because <code class=\"docutils literal notranslate\">create_user()</code>\nis a manager method, not a <code class=\"docutils literal notranslate\">QuerySet</code> method, you can't do\n<code class=\"docutils literal notranslate\">User.objects.using('new_users').create_user()</code>. (The\n<code class=\"docutils literal notranslate\">create_user()</code> method is only available on <code class=\"docutils literal notranslate\">User.objects</code>, the\nmanager, not on <code class=\"docutils literal notranslate\">QuerySet</code> objects derived from the manager.) The\nsolution is to use <code class=\"docutils literal notranslate\">db_manager()</code>, like this:</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>User<span class=\"o\">.</span>objects<span class=\"o\">.</span>db_manager<span class=\"p\">(</span><span class=\"s1\">&#39;new_users&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>create_user<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">db_manager()</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\">get_queryset()</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>If you're overriding <code class=\"docutils literal notranslate\">get_queryset()</code> on your manager, be sure to\neither call the method on the parent (using <code class=\"docutils literal notranslate\">super()</code>) or do the\nappropriate handling of the <code class=\"docutils literal notranslate\">_db</code> attribute on the manager (a string\ncontaining the name of the database to use).</p>\n<p>Sebagai contoh, jika anda ingin mengembalikan penyesuaian kelas <code class=\"docutils literal notranslate\">QuerySet</code> dari metode <code class=\"docutils literal notranslate\">get_queryset</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=\"nc\">MyManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        qs <span class=\"o\">=</span> CustomQuerySet<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>model<span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>_db <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            qs <span class=\"o\">=</span> qs<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>_db<span class=\"p\">)</span>\n        <span class=\"k\">return</span> qs\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>Django's admin doesn't have any explicit support for multiple\ndatabases. If you want to provide an admin interface for a model on a\ndatabase other than that specified by your router chain, you'll\nneed to write custom <a class=\"reference internal\" href=\"/id/1.10/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> classes\nthat will direct the admin to use a specific database for content.</p>\n<p>Obyek <code class=\"docutils literal notranslate\">ModelAdmin</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=\"nc\">MultiDBModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"c1\"># A handy constant for the name of the alternate database.</span>\n    using <span class=\"o\">=</span> <span class=\"s1\">&#39;other&#39;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">save_model</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"p\">,</span> form<span class=\"p\">,</span> change<span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to save objects to the &#39;other&#39; database.</span>\n        obj<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">delete_model</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to delete objects from the &#39;other&#39; database</span>\n        obj<span class=\"o\">.</span>delete<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<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>MultiDBModelAdmin<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>get_queryset<span class=\"p\">(</span>request<span class=\"p\">)</span><span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_foreignkey</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<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>MultiDBModelAdmin<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>formfield_for_foreignkey<span class=\"p\">(</span>db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_manytomany</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<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>MultiDBModelAdmin<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>formfield_for_manytomany<span class=\"p\">(</span>db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n</code></pre></div>\n<p>The implementation provided here implements a multi-database strategy\nwhere all objects of a given type are stored on a specific database\n(e.g., all <code class=\"docutils literal notranslate\">User</code> objects are in the <code class=\"docutils literal notranslate\">other</code> database). If your\nusage of multiple databases is more complex, your <code class=\"docutils literal notranslate\">ModelAdmin</code> will\nneed to reflect that strategy.</p>\n<p>Obyek <a class=\"reference internal\" href=\"/id/1.10/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">InlineModelAdmin</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=\"nc\">MultiDBTabularInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span>\n    using <span class=\"o\">=</span> <span class=\"s1\">&#39;other&#39;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<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>MultiDBTabularInline<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>get_queryset<span class=\"p\">(</span>request<span class=\"p\">)</span><span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_foreignkey</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<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>MultiDBTabularInline<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>formfield_for_foreignkey<span class=\"p\">(</span>db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_manytomany</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<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>MultiDBTabularInline<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>formfield_for_manytomany<span class=\"p\">(</span>db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<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\">Admin</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=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\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=\"nc\">BookInline</span><span class=\"p\">(</span>MultiDBTabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Book\n\n<span class=\"k\">class</span> <span class=\"nc\">PublisherAdmin</span><span class=\"p\">(</span>MultiDBModelAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>BookInline<span class=\"p\">]</span>\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Author<span class=\"p\">,</span> MultiDBModelAdmin<span class=\"p\">)</span>\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Publisher<span class=\"p\">,</span> PublisherAdmin<span class=\"p\">)</span>\n\nothersite <span class=\"o\">=</span> admin<span class=\"o\">.</span>AdminSite<span class=\"p\">(</span><span class=\"s1\">&#39;othersite&#39;</span><span class=\"p\">)</span>\nothersite<span class=\"o\">.</span>register<span class=\"p\">(</span>Publisher<span class=\"p\">,</span> MultiDBModelAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<p>Contoh ini menyetel dua situs admin. Pada situs pertama, obyek <code class=\"docutils literal notranslate\">Author</code> dan <code class=\"docutils literal notranslate\">Publisher</code> diperlihatkan; obyek <code class=\"docutils literal notranslate\">Publisher</code> mempunyai berderet datar menunjukkan buku-buku diterbitkan oleh penerbit itu. Situs kedua memperlihatkan hanya penerbit, tanpa berderet.</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\">django.db.connections</code> untuk mengambil hubungan (dan kursor) untuk basisdata tertentu. <code class=\"docutils literal notranslate\">django.db.connections</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=\"nn\">django.db</span> <span class=\"kn\">import</span> connections\ncursor <span class=\"o\">=</span> connections<span class=\"p\">[</span><span class=\"s1\">&#39;my_db_alias&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>cursor<span class=\"p\">()</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 doesn't currently provide any support for foreign key or\nmany-to-many relationships spanning multiple databases. If you\nhave used a router to partition models to different databases,\nany foreign key and many-to-many relationships defined by those\nmodels must be internal to a single database.</p>\n<p>This is because of referential integrity. In order to maintain a\nrelationship between two objects, Django needs to know that the\nprimary key of the related object is valid. If the primary key is\nstored on a separate database, it's not possible to easily evaluate\nthe validity of a 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>However, if you're using SQLite or MySQL with MyISAM tables, there is\nno enforced referential integrity; as a result, you may be able to\n'fake' cross database foreign keys. However, this configuration is not\nofficially supported by 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>Several contrib apps include models, and some apps depend on others. Since\ncross-database relationships are impossible, this creates some restrictions on\nhow you can split these models across databases:</p>\n<ul class=\"simple\">\n<li><p>each one of <code class=\"docutils literal notranslate\">contenttypes.ContentType</code>, <code class=\"docutils literal notranslate\">sessions.Session</code> and\n<code class=\"docutils literal notranslate\">sites.Site</code> can be stored in any database, given a suitable router.</p></li>\n<li><p><code class=\"docutils literal notranslate\">auth</code> models — <code class=\"docutils literal notranslate\">User</code>, <code class=\"docutils literal notranslate\">Group</code> and <code class=\"docutils literal notranslate\">Permission</code> — are linked\ntogether and linked to <code class=\"docutils literal notranslate\">ContentType</code>, so they must be stored in the same\ndatabase as <code class=\"docutils literal notranslate\">ContentType</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">admin</code> bergantung pada <code class=\"docutils literal notranslate\">auth</code>, jadi modelnya harus di basisdata sama seperti <code class=\"docutils literal notranslate\">auth</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">flatpages</code> dan <code class=\"docutils literal notranslate\">redirects</code> bergantung pada <code class=\"docutils literal notranslate\">sites</code>,jadi model-model mereka harus di basisdata yang sama seperti <code class=\"docutils literal notranslate\">sites</code>.</p></li>\n</ul>\n<p>In addition, some objects are automatically created just after\n<a class=\"reference internal\" href=\"/id/1.10/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> creates a table to hold them in a database:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">Site</code> awal,</p></li>\n<li><p>sebuah <code class=\"docutils literal notranslate\">ContentType</code> untuk setiap model (termasuk itu tidak disimpan di basisdata itu),</p></li>\n<li><p>tiga <code class=\"docutils literal notranslate\">Permission</code> untuk setiap model (termasuk itu tidak disimpan di basisdata itu),</p></li>\n</ul>\n<p>For common setups with multiple databases, it isn't useful to have these\nobjects in more than one database. Common setups include primary/replica and\nconnecting to external databases. Therefore, it's recommended to write a\n<a class=\"reference internal\" href=\"#topics-db-multi-db-routing\"><span class=\"std std-ref\">database router</span></a> that allows synchronizing\nthese three models to only one database. Use the same approach for contrib\nand third-party apps that don't need their tables in multiple databases.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>If you're synchronizing content types to more than one database, be aware\nthat their primary keys may not match across databases. This may result in\ndata corruption or data loss.</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":"Using other management commands","anchor":"using-other-management-commands","children":[]}]},{"title":"Automatic database routing","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/1.10/topics/"},{"docname":"topics/db/index","title":"Model dan basisdata","url":"/id/1.10/topics/db/"}],"prev":{"docname":"topics/db/transactions","title":"Transaksi basisdata","url":"/id/1.10/topics/db/transactions/"},"next":{"docname":"topics/db/tablespaces","title":"Tablespaces","url":"/id/1.10/topics/db/tablespaces/"},"formats":{"html":"/id/1.10/topics/db/multi-db/","markdown":"/id/1.10/topics/db/multi-db.md","json":"/id/1.10/topics/db/multi-db.json"},"source":"https://github.com/django/django/blob/stable/1.10.x/docs/topics/db/multi-db.txt","official":"https://docs.djangoproject.com/id/1.10/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","fr","ja","id","pt-br","es","el","pl"]}