{"title":"Menulis bidang model penyesuaian","version":"1.9","locale":"id","docname":"howto/custom-model-fields","url":"/id/1.9/howto/custom-model-fields/","canonical":"https://djangodocs.dev/id/1.9/howto/custom-model-fields/","summary":"Dokumentasi model acuan menjelaskan bagaimana menggunakan kelas-kelas bidang standar Django -- CharField, DateField, dll.","html":"<h1>Menulis bidang model penyesuaian<a class=\"heading-anchor\" href=\"#writing-custom-model-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"introduction\">\n<h2>Kata Pengantar<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Dokumentasi <a class=\"reference internal\" href=\"/id/1.9/topics/db/models/\"><span class=\"doc\">model acuan</span></a> menjelaskan bagaimana menggunakan kelas-kelas bidang standar Django -- <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>, <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a>, dll. Untuk banyak tujuan, kelas-kelas tersebut adalah yang anda akan butuhkan. Terkadang, meskipun, versi DJango tidak akan bertemu persyaratan tepat anda, atau anda akan menggunakan sebuah bidang yang seluruhnya berbeda dari yang dikemas dengan Django.</p>\n<p>Jenis bidang siap pakai Django tidak mencangkup setiap jenis kolom basisdata yang mungkin -- hanya jenis umum, seperti <code class=\"docutils literal notranslate\">VARCHAR</code> dan <code class=\"docutils literal notranslate\">INTEGER</code>. Untuk lebih mengaburkan jenis kolom, seperti poligon geografis atau bahkan jenis dibuat-pengguna seperti <a class=\"reference external\" href=\"http://www.postgresql.org/docs/current/interactive/sql-createtype.html\">PostgreSQL custom types</a>, anda dapat menentukan subkelas-subkelas <code class=\"docutils literal notranslate\">Field</code> Django and sendiri.</p>\n<p>Jalan lain, anda mungkin mempunyai obyek Python rumit yang dapat entah bagaimana disambungkan untuk cocok kedalam jenis kolom basisdata standar. Ini adalah kasus lain dimana sebuah subkelas <code class=\"docutils literal notranslate\">Field</code> akan membantu anda menggunakan obyek anda dengan model anda.</p>\n<section id=\"our-example-object\">\n<h3>Obyek contoh kami<a class=\"heading-anchor\" href=\"#our-example-object\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Membuat penyesuaian bidang membuatuhkan sedikit perhatian ke rincian. Untuk membuat hal-hal lebih mudah utnuk diikuti, kami akan menggunakan contoh tetap melalui dokumen ini: membungkus sebuah obyek Python mewakili persetujuan dari kartu-kartu dalam sebuah tangan dari <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Contract_bridge\">Bridge</a>. Jangan khawatir, anda tidak perlu mengetahui bagaimana bermain Bridge untuk mengikuti contoh ini. Anda hanya perlu mengetahui bahwa 52 kartu dibagikan sama ke empat pemain, yang secara tradisional dipanggil <em>utara</em>, <em>timur</em>, <em>selatan</em> dan <em>barat</em>. Kelas kami kelihatan 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=\"k\">class</span> <span class=\"nc\">Hand</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;A hand of cards (bridge style)&quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> north<span class=\"p\">,</span> east<span class=\"p\">,</span> south<span class=\"p\">,</span> west<span class=\"p\">):</span>\n        <span class=\"c1\"># Input parameters are lists of cards (&#39;Ah&#39;, &#39;9s&#39;, etc.)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>north <span class=\"o\">=</span> north\n        <span class=\"bp\">self</span><span class=\"o\">.</span>east <span class=\"o\">=</span> east\n        <span class=\"bp\">self</span><span class=\"o\">.</span>south <span class=\"o\">=</span> south\n        <span class=\"bp\">self</span><span class=\"o\">.</span>west <span class=\"o\">=</span> west\n\n    <span class=\"c1\"># ... (other possibly useful methods omitted) ...</span>\n</code></pre></div>\n<p>Ini hanyalah kelas Python asli, dengan tidak ada spesifik-Django tentangnya. Kami akan dapat melakukan hal-hal seperti ini dalam model kami (kami menganggap atribut <code class=\"docutils literal notranslate\">hand</code> pada model adalah sebuah instance dari <code class=\"docutils literal notranslate\">Hand</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>example <span class=\"o\">=</span> MyModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span>example<span class=\"o\">.</span>hand<span class=\"o\">.</span>north<span class=\"p\">)</span>\n\nnew_hand <span class=\"o\">=</span> Hand<span class=\"p\">(</span>north<span class=\"p\">,</span> east<span class=\"p\">,</span> south<span class=\"p\">,</span> west<span class=\"p\">)</span>\nexample<span class=\"o\">.</span>hand <span class=\"o\">=</span> new_hand\nexample<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Kami memberikan dan mengambil dari atribut <code class=\"docutils literal notranslate\">hand</code> dalam model kami seperti kelas Python lainnya. Tipuannya adalah mengatakan Django bagaimana menangani penyimpanan dan memuat sebuah obyek seperti itu.</p>\n<p>Agar menggunakan kelas <code class=\"docutils literal notranslate\">Hand</code> di model kami, kami <strong>tidak</strong> harus merubah kelas ini sama sekali. Ini adalah cocok, karena dia berarti anda dapat  dengan mudah menulis model mendukung kelas-kelas yang ada dimana anda tidak dapat merubah sumber kode.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Anda mungkin hanya menginginkan untuk mengambil keuntungan dari penyesuaian jenis kolom basisdata dan berhubungan dengan data sebagai jenis Python standar dalam model anda; string, atau float, sebagai contoh. Kasus ini mirip pada contoh <code class=\"docutils literal notranslate\">hand</code> kami dan kami akan mencatat perbedaan ketika kita pergi bersama.</p>\n</aside>\n</section>\n</section>\n<section id=\"background-theory\">\n<h2>Latar belakang teori<a class=\"heading-anchor\" href=\"#background-theory\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"database-storage\">\n<h3>Penyimpanan basisdata<a class=\"heading-anchor\" href=\"#database-storage\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jalan paling sederhana memikirkan sebuah bidang model adalah dia menyediakan sebuah jalan untuk mengambil sebuah obyek Pyton biasa -- string, boolean, <code class=\"docutils literal notranslate\">datetime</code>, atau sesuatu lebih rumit seperti <code class=\"docutils literal notranslate\">Hand</code> -- dan merubahnya ke dan dari sebuah bentuk yang berguna ketika berhubungan dengan basisdata (dan penyambungan, tetapi, seperti yang akan kita lihat nanti, yang jatuh keluar secara alami sekali anda mempunyai sisi basisdata dibawah kendali).</p>\n<p>Bidang dalam sebuah model harus bagaimanapun dipindahkan untuk cocok kedalam jenis kolom basisdata yang ada. Basisdata yang berbeda menyediakan kumpulan berbeda dari jenis kolom sah, tetapi aturan masih sama: yaitu hanya jenis anda harus bekerja dengannya. Apapun anda ingin simpan dalam basisdata harus cocok kedalam satu dari jenis itu.</p>\n<p>Biasanya, anda antara menulis sebuah bidang Django untuk mencocokkan jenis kolom basisdata tertentu, atau ada jalan cukup mudah untuk merubah data anda menjadi, katakan, sebuah deretan karakter.</p>\n<p>Untuk contoh <code class=\"docutils literal notranslate\">Hand</code> kami, kami dapat merubah kartu data menjadi deretan karakter dari 104 karakter dengan menambah semua kartu bersama-sama dalam yang telah ditetapkan sebelumnya -- katakan, semua kartu <em>utara</em> dahulu, kemudian kartu <em>timur</em>, <em>selatan</em> dan <em>barat</em>. Hadi obyek <code class=\"docutils literal notranslate\">Hand</code> dapt disimpan ke kolom teks atau karakter dalam basisdata.</p>\n</section>\n<section id=\"what-does-a-field-class-do\">\n<h3>Apakah yang kelas bidang lakukan?<a class=\"heading-anchor\" href=\"#what-does-a-field-class-do\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Semua bidang Django (dan ketika kami katakan <em>bidang</em> dalam dokumen ini, kami selalu berarti bidang model dan bukan <a class=\"reference internal\" href=\"/id/1.9/ref/forms/fields/\"><span class=\"doc\">bidang formulir</span></a>) adalah subkelas dari <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.Field</code></a>. Kebanyakan informasi yang Django rekam mengenai sebuah bidang adalah umum bagi semua teman -- nama, bantuan, teks, keunikan dan sebagainya. Menyimpan semua informasi itu yang ditangani oleh <code class=\"docutils literal notranslate\">Field</code>. Kami akan memasuki rincian tepat dari <code class=\"docutils literal notranslate\">Field</code> apa yang dapat dilakukan kemudian; untuk sekarang, cukuplah untuk mengatakan bahwa segala sesuatu turun dari <code class=\"docutils literal notranslate\">Field</code> dan kemudian menyesuaian potongan kunci dari kebiasaan kelas.</p>\n<p>Adalah penting untuk menyadari bahwa sebuah kelas bidang Django bukan apa yang disimpan dalam atribut model anda. Pengaturan model mengandung obyek Python biasa. Kelas-kelas bidang yang anda tentukan dalam sebuah model sebenarnya disimpan dalam kelas <code class=\"docutils literal notranslate\">Meta</code> ketika kelas model dibuat (rincian tepatnya bagaimana ini dilakukan adalah tidak penting disini). Ini karena kelas-kelas bidang tidak perlu ketika anda hanya membuat dan merubah atribut. Sebagai gantinya, mereka menyediakan mesin-mesin untuk merubah diantara nilai atribut dan apa yang disimpan dalam basisdata atau dikirim ke <a class=\"reference internal\" href=\"/id/1.9/topics/serialization/\"><span class=\"doc\">serializer</span></a>.</p>\n<p>Ingatlah ini ketika membuat penyesuaian bidang sendiri. Subkelas <code class=\"docutils literal notranslate\">Field</code> Django anda tulis menyediakan mesin-mesin untuk merubah diantara instance Python anda dan nilai database/serializer dalam beragam cara (ada perbedaan diantara menyimpan sebuah nilai dan menggunakan sebuah nilai untuk pencarian, sebagai contoh). Jika ini terdengar sedikit rumit, jangan khawatir -- dia akan menjadi lebih jelas dalam contoh dibawah ini. Ingatlah bahwa anda akan sering membuat dua kelas ketika anda ingin penyesuaian bidang:</p>\n<ul class=\"simple\">\n<li><p>Kelas pertama adalah obyek Python dimana pengguna anda akan merubah. Mereka akan menetapkannya ke atribut model, mereka akan membaca darinya untuk menampilkan tujuan, hal-hal seperti itu. ini adalah kelas <code class=\"docutils literal notranslate\">hand</code> dalam contoh kami.</p></li>\n<li><p>Kelas kedua adalah subkelas <code class=\"docutils literal notranslate\">Field</code>. Ini adalah kelas yang diketahui bagaimana merubah kelas pertama anda ke belakang dan seterusnya diantara bentuk penyimpanan tetap dan bentuk Python.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"writing-a-field-subclass\">\n<h2>Menulis sebuah subkelas bidang<a class=\"heading-anchor\" href=\"#writing-a-field-subclass\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ketika merencanakan subkelas <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> anda, pertama berikan beberapa diduga yang mana ada kelas <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> bidang baru anda yang paling mirip. Dapatkah anda mensubkelaskan bidang Django yang ada dan menyimpan diri anda beberapa pekerjaan? Jika tidak, anda harus mensubkelaskan kelas <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a>, yang semuanya turun.</p>\n<p>Inisialisasi bidang baru anda adalah sebuah masalah dari memisahkan argumen apapun yang khusus pada kasus anda dari argumen umum dan melewatkannya ke cara __init__()` dari <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> (atau kelas induk anda).</p>\n<p>Dalam contoh kami, kami akan memanggil bidang <code class=\"docutils literal notranslate\">HandField</code>. (Adalah ide bagus untuk memanggil subkelas <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> anda <code class=\"docutils literal notranslate\">&lt;Something&gt;Field</code>, sehingga sangat mudah dicirikan sebagai sebuah subkelas <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a>.) Dia tidak berperilaku seperti bidang lainnya yang ada, jadi kami akan mensubkelaskan secara langsung dari <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">HandField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n\n    description <span class=\"o\">=</span> <span class=\"s2\">&quot;A hand of cards (bridge style)&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        kwargs<span class=\"p\">[</span><span class=\"s1\">&#39;max_length&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">104</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span>HandField<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">HandField</code> kami menerima kebanyakan pilihan bidang standar (lihat daftar dibawah ini), tetapi kami memastikan dia mempunyai panjang tetap, sejak dia hanya butuh menampung 52 nilai kartu ditambah pasangan mereka; 104 karakter jumlahnya.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Banyak bidang model Django menerima pilihan dimana mereka tidak melakukan apapun. Sebagai contoh, anda dapat melewatkan kedua <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\">editable</code></a> dan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\">auto_now</code></a> ke a <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.DateField</code></a> dan dia dengan mudah mengabaikan parameter <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\">editable</code></a> (<a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\">auto_now</code></a> menjadi disiratkan <code class=\"docutils literal notranslate\">editable=False</code>). Tidak ada kesalahan dimunculkan dalam kasus ini.</p>\n<p>Kebiasaan ini menyederhanakan kelas-kelas bidang, karena mereka tidak butuh memeriksa untuk pilihan yang tidak dibutuhkan. Mereka hanya melewatkan semua pilihan ke kelas induk dan kemudian tidak menggunakan mereka kemudian. Itu terserah anda apakah anda ingin bidang anda lebih tegas tentang pilihan mereka pilih, atau menggunakan lebih sederhana, kebiasaan yang tidak wajib dari bidang saat ini.</p>\n</aside>\n<p>Cara <code class=\"docutils literal notranslate\">Field.__init__()</code> mengambil parameter berikut:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.verbose_name\" title=\"django.db.models.Field.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">nama</code></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\">primary_key</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.CharField.max_length\" title=\"django.db.models.CharField.max_length\"><code class=\"xref py py-attr docutils literal notranslate\">max_length</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\">unique</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\">blank</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\">null</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.db_index\" title=\"django.db.models.Field.db_index\"><code class=\"xref py py-attr docutils literal notranslate\">db_index</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">rel</code>: Digunakan untuk bidang terkait (seperti <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>). Hanya untuk penggunaan lanjut.</p></li>\n<li><p>attr:~django.db.models.Field.default</p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\">editable</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">serialize</code>: Jika <code class=\"docutils literal notranslate\">False</code>, bidang tidak akan didisambungkan ketika model dilewatkan ke <a class=\"reference internal\" href=\"/id/1.9/topics/serialization/\"><span class=\"doc\">serializers</span></a> Django. Nilai awal ke <code class=\"docutils literal notranslate\">True</code>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.unique_for_date\" title=\"django.db.models.Field.unique_for_date\"><code class=\"xref py py-attr docutils literal notranslate\">unique_for_date</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.unique_for_month\" title=\"django.db.models.Field.unique_for_month\"><code class=\"xref py py-attr docutils literal notranslate\">unique_for_month</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.unique_for_year\" title=\"django.db.models.Field.unique_for_year\"><code class=\"xref py py-attr docutils literal notranslate\">unique_for_year</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.choices\" title=\"django.db.models.Field.choices\"><code class=\"xref py py-attr docutils literal notranslate\">choices</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.help_text\" title=\"django.db.models.Field.help_text\"><code class=\"xref py py-attr docutils literal notranslate\">help_text</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.db_column\" title=\"django.db.models.Field.db_column\"><code class=\"xref py py-attr docutils literal notranslate\">db_column</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.db_tablespace\" title=\"django.db.models.Field.db_tablespace\"><code class=\"xref py py-attr docutils literal notranslate\">db_tablespace</code></a>: hanya untuk pembuatan indeks, jika dukungan backend <a class=\"reference internal\" href=\"/id/1.9/topics/db/tablespaces/\"><span class=\"doc\">tablespaces</span></a>. Anda dapat biasanya mengabaikan pilihan ini.</p></li>\n<li><p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.auto_created\" title=\"django.db.models.Field.auto_created\"><code class=\"xref py py-attr docutils literal notranslate\">auto_created</code></a>: <code class=\"docutils literal notranslate\">True</code> jika bidang otomatis telah dibuat, adapun <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> digunakan oleh warisan model. Untuk penggunaan hanya tingkat lanjut.</p></li>\n</ul>\n<p>Semua pilihan tanpa sebuah penjelasan dalam daftar diatas mempunyai arti yang sama mereka lakukan untuk bidang Django biasa. Lihat <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/\"><span class=\"doc\">field documentation</span></a> untuk contoh dan rincian.</p>\n<section id=\"field-deconstruction\">\n<span id=\"custom-field-deconstruct-method\"></span><h3>Membongkar bidang<a class=\"heading-anchor\" href=\"#field-deconstruction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Kontrapung untuk menulis cara <code class=\"docutils literal notranslate\">__init__()</code> anda adalah menulis cara <code class=\"docutils literal notranslate\">deconstruct()</code>. Cara ini mengatakan Django bagaimana mengambil instance dari bidang baru anda dan menguranginya untuk sebuah formulir yang disambungkan - khususnya, argumen apa utnuk dilewatkan ke <code class=\"docutils literal notranslate\">__init__()</code> untuk membuatnya kembali.</p>\n<p>Jika anda belum menambahkan pilihan tambahan pada bagian atas bidang anda warisi, lalu tidak perlu untuk menulis cara <code class=\"docutils literal notranslate\">deconstruct()</code> baru. Jika, bagaimanapun, anda sedang merubah argumen dilewati dalam <code class=\"docutils literal notranslate\">__init__()</code> (seperti kami dalam <code class=\"docutils literal notranslate\">HandField</code>), anda akan butuh tambahan nilai yang sedang dilewati.</p>\n<p>Kontrak dari <code class=\"docutils literal notranslate\">deconstruct()</code> adalah sederhana; dia mengembalikan sebuah tuple dari empat barang: nama atribut bidang, jalur impor penuh dari kelas bidang, penempatan argumen (sebagai sebuah daftar), dan argumen kata kunci (sebagai pendiktean). Catat bahwa ini berbeda dari cara <code class=\"docutils literal notranslate\">deconstruct()</code> <a class=\"reference internal\" href=\"/id/1.9/topics/migrations/#custom-deconstruct-method\"><span class=\"std std-ref\">for custom classes</span></a> yang mengembalikan sebuah tuple dari tiga hal.</p>\n<p>Sebagai sebuah penyesuaian bidang penulis, anda tidak perlu memperhatikan tentang dua nilai pertama; kelas <code class=\"docutils literal notranslate\">Field</code> dasar mempunyai semua kode untuk bekerja nama atribut bidang dan mengimpor jalur. Anda, bagaimanapun, harus memperhatikan tentang penempatan dan katakunci argumen, seperti ini mirip hal-hal anda sedang rubah.</p>\n<p>Sebagai contoh, dalam kelas <code class=\"docutils literal notranslate\">HandField</code> kami selalu memaksa menyetel max_length dalam <code class=\"docutils literal notranslate\">__init__()</code>. Cara <code class=\"docutils literal notranslate\">deconstruct()</code> dalam basis kelas <code class=\"docutils literal notranslate\">Field</code> akan melihat ini dan mencoba mengembalikannya dalam argumen katakunci; demikian, kami dapat membuangnya dari argumen katakunci untuk kesiapan:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">HandField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        kwargs<span class=\"p\">[</span><span class=\"s1\">&#39;max_length&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">104</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span>HandField<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">deconstruct</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        name<span class=\"p\">,</span> path<span class=\"p\">,</span> args<span class=\"p\">,</span> kwargs <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span>HandField<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>deconstruct<span class=\"p\">()</span>\n        <span class=\"k\">del</span> kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;max_length&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> name<span class=\"p\">,</span> path<span class=\"p\">,</span> args<span class=\"p\">,</span> kwargs\n</code></pre></div>\n<p>Jika anda menambahkan argumen kata kunci, anda perlu menuliskan sendiri kode untuk menambahkan nilai ke <code class=\"docutils literal notranslate\">kwargs</code></p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">CommaSepField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"s2\">&quot;Implements comma-separated storage of lists&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> separator<span class=\"o\">=</span><span class=\"s2\">&quot;,&quot;</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>separator <span class=\"o\">=</span> separator\n        <span class=\"nb\">super</span><span class=\"p\">(</span>CommaSepField<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">deconstruct</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        name<span class=\"p\">,</span> path<span class=\"p\">,</span> args<span class=\"p\">,</span> kwargs <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span>CommaSepField<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>deconstruct<span class=\"p\">()</span>\n        <span class=\"c1\"># Only include kwarg if it&#39;s not the default</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>separator <span class=\"o\">!=</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"p\">:</span>\n            kwargs<span class=\"p\">[</span><span class=\"s1\">&#39;separator&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>separator\n        <span class=\"k\">return</span> name<span class=\"p\">,</span> path<span class=\"p\">,</span> args<span class=\"p\">,</span> kwargs\n</code></pre></div>\n<p>Contoh lebih rumit diluar cakupan dari dokumen ini, tetapi ingat - untuk konfigurasi apapun dari instance Field anda, <code class=\"docutils literal notranslate\">deconstruct()</code> harus mengembalikan argumen yang anda dapat lewati ke <code class=\"docutils literal notranslate\">__init__</code> untuk membangun kembali keadaan tersebut.</p>\n<p>Beri perhatian lebih jika anda menyetel nilai baru awal untuk argumen dalam super kelas <code class=\"docutils literal notranslate\">Field</code>; anda ingin memastikan mereka selalu disertakan, daripada  menghilang jika mereka mengambil nilai awal lama.</p>\n<p>Dalam tambahan, coba untuk menghindari nilai kembalian sebagai argumen penempatan; jika memungkinkan, kembalikan nilai sebagai argumen katakunci untuk kesesuaian masa depan maksimal. Tentu saja, jika anda merubah nama dari hal-hal sering daripada penempatan mereka dalam daftar argumen pembangun, anda mungkin memilih penempatan, tetapi ingatlah bahwa orang akan membangun kembali bidang ada dari versi bersambung untuk sejenak (mungkin tahunan), tergantung berapa lama perpindahan langsung anda.</p>\n<p>Anda dapat melihat hasil dari membongkar dengan mencari dalam perpindahan yang menyertakan bidang, dan anda dapat menguji pembongkaran dalam satuan percobaan dengan hanya membongkar dan membangun kembali bidang.</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>name<span class=\"p\">,</span> path<span class=\"p\">,</span> args<span class=\"p\">,</span> kwargs <span class=\"o\">=</span> my_field_instance<span class=\"o\">.</span>deconstruct<span class=\"p\">()</span>\nnew_instance <span class=\"o\">=</span> MyField<span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n<span class=\"bp\">self</span><span class=\"o\">.</span>assertEqual<span class=\"p\">(</span>my_field_instance<span class=\"o\">.</span>some_attribute<span class=\"p\">,</span> new_instance<span class=\"o\">.</span>some_attribute<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"changing-a-custom-field-s-base-class\">\n<h3>Changing a custom field's base class<a class=\"heading-anchor\" href=\"#changing-a-custom-field-s-base-class\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You can't change the base class of a custom field because Django won't detect\nthe change and make a migration for it. For example, if you start with:</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\">CustomCharField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>CharField<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>and then decide that you want to use <code class=\"docutils literal notranslate\">TextField</code> instead, you can't change\nthe subclass 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><span class=\"k\">class</span> <span class=\"nc\">CustomCharField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>TextField<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Instead, you must create a new custom field class and update your models to\nreference it:</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\">CustomCharField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>CharField<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">CustomTextField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>TextField<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>As discussed in <a class=\"reference internal\" href=\"/id/1.9/topics/migrations/#migrations-removing-model-fields\"><span class=\"std std-ref\">removing fields</span></a>, you\nmust retain the original <code class=\"docutils literal notranslate\">CustomCharField</code> class as long as you have\nmigrations that reference it.</p>\n</section>\n<section id=\"documenting-your-custom-field\">\n<h3>Mendokumentasikan bidang penyesuaian anda<a class=\"heading-anchor\" href=\"#documenting-your-custom-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Seperti biasa, anda harus mendokumentasikan jenis bidang anda, sehingga pengguna akan mengetahui apa itu. Dalam tambahan untuk menyediakan docstring untuknya, mana yang berguna untuk pengembang, anda dapat juga mengizinkan aplikasi admin untuk melihat gambaran pendek dari jenis bidang melalui aplikasi <a class=\"reference internal\" href=\"/id/1.9/ref/contrib/admin/admindocs/\"><span class=\"doc\">django.contrib.admindocs</span></a>. Untuk melakukan ini cukup menyediakan gambaran teks dalam sebuah atribut kelas <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.description\" title=\"django.db.models.Field.description\"><code class=\"xref py py-attr docutils literal notranslate\">description</code></a> dari bidang penyesuaian anda. Dalam contoh diatas, gambaran ditampilkan oleh aplikasi <code class=\"docutils literal notranslate\">admindocs</code> untuk sebuah <code class=\"docutils literal notranslate\">HandField</code> akan menjadi 'Sebuah tangan dari kartu (gaya bridge)'.</p>\n<p>Dalam tampilan <a class=\"reference internal\" href=\"/id/1.9/ref/contrib/admin/admindocs/#module-django.contrib.admindocs\" title=\"django.contrib.admindocs: Django's admin documentation generator.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admindocs</code></a>, gambaran bidang ditambahkan dengan <code class=\"docutils literal notranslate\">field.__dict__</code> yang mengizinkan gambaran pada argumen yang digabungkan dari bidang. Sebagai contoh, gambaran untuk <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> adalah:</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>description <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;String (up to </span><span class=\"si\">%(max_length)s</span><span class=\"s2\">)&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"useful-methods\">\n<h3>Cara berguna<a class=\"heading-anchor\" href=\"#useful-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Sekali anda telah membuat subkelas <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> anda, anda boleh mempertimbangkan mengesampingkan sedikit cara standar, tergantung pada kebiasaan bidang anda. Daftar dari cara dibawah ini adalah dalam lebih kurang menurun urutan dari kepentingan, jadi mulai dari atas.</p>\n<section id=\"custom-database-types\">\n<span id=\"id1\"></span><h4>Jenis basisdata penyesuaian<a class=\"heading-anchor\" href=\"#custom-database-types\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Katakan anda telah membuat jenis penyesuaian PostgreSQL dipanggil <code class=\"docutils literal notranslate\">mtype</code>. Anda dapat mensubkelaskan <code class=\"docutils literal notranslate\">Field</code> dan menerapkan cara <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\">db_type()</code></a>, seperti begitu:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">MytypeField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> connection<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;mytype&#39;</span>\n</code></pre></div>\n<p>Sekali anda mempunyai <code class=\"docutils literal notranslate\">MytypeField</code>, anda dapat menggunakannya di model apapun, seperti jenis <code class=\"docutils literal notranslate\">Field</code> apapun 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=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">80</span><span class=\"p\">)</span>\n    something_else <span class=\"o\">=</span> MytypeField<span class=\"p\">()</span>\n</code></pre></div>\n<p>Jika anda menuju membangun aplikasi agnostik-basisdata, anda harus melaporkan untuk perbedaan dalam jenis kolom basisdata. Sebagai contoh, jenis kolom date/time dalam PostgreSQL dipanggil <code class=\"docutils literal notranslate\">timestamp</code>, sementara kolom yang sama dalam MySQL dipanggil <code class=\"docutils literal notranslate\">datetime</code>. Jalan termudah untuk menangani ini dalam cara <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\">db_type()</code></a> adalah untuk memeriksa atribut <code class=\"docutils literal notranslate\">connection.settings_dict['ENGINE']</code>.</p>\n<p>Sebagai contoh:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyDateField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> connection<span class=\"p\">):</span>\n        <span class=\"k\">if</span> connection<span class=\"o\">.</span>settings_dict<span class=\"p\">[</span><span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;django.db.backends.mysql&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;datetime&#39;</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;timestamp&#39;</span>\n</code></pre></div>\n<p>Cara <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\">db_type()</code></a> dipanggil oleh Django ketika kerangka membangun pernyataan <code class=\"docutils literal notranslate\">CREATE TABLE</code> untuk aplikasi anda -- yaitu, ketika anda pertama kali membuat tabel anda. Dia juga dipanggil ketika membangun klausa <code class=\"docutils literal notranslate\">WHERE</code> yang menyertakan bidang model -- yaitu, ketika anda mengambil data menggunakan cara QuerySet seperti <code class=\"docutils literal notranslate\">get()</code>, <code class=\"docutils literal notranslate\">filter()</code>, dan <code class=\"docutils literal notranslate\">exclude()</code> dan mempunyai bidang model sebagai sebuah argumen. Dia tidak dipanggil pada lain waktu, jadi dia dapat mampu menjalankan sedikit kode rumit , seperti <code class=\"docutils literal notranslate\">connection.settings_dict</code> diperiksa dalam contoh diatas.</p>\n<p>Beberapa jenis kolom basisdata menerima parameter, seperti <code class=\"docutils literal notranslate\">CHAR(25)</code>, dimana parameter <code class=\"docutils literal notranslate\">25</code> mewakili panjang kolom maksimum. Dalam kasus seperti ini, dia lebih supel jika parameter ditentukan dalam model daripada menjadi kode-keras dalam cara <code class=\"docutils literal notranslate\">db_type()</code>. Sebagai contoh, dia tidak akan masuk akan untuk mempunyai <code class=\"docutils literal notranslate\">CharMaxlength25Field</code>, ditampilkan disini:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># This is a silly example of hard-coded parameters.</span>\n<span class=\"k\">class</span> <span class=\"nc\">CharMaxlength25Field</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> connection<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;char(25)&#39;</span>\n\n<span class=\"c1\"># In the model:</span>\n<span class=\"k\">class</span> <span class=\"nc\">MyModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    my_field <span class=\"o\">=</span> CharMaxlength25Field<span class=\"p\">()</span>\n</code></pre></div>\n<p>Jalan lebih baik dari mengerjakan ini adalah membuat parameter dapat lebih khusus pada wktu berjalan -- yaitu, ketika kelas dipakai. Untuk melakukan itu, cukup terapkan <code class=\"docutils literal notranslate\">Field.__init__()</code>, seperti begitu:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># This is a much more flexible example.</span>\n<span class=\"k\">class</span> <span class=\"nc\">BetterCharField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> max_length<span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>max_length <span class=\"o\">=</span> max_length\n        <span class=\"nb\">super</span><span class=\"p\">(</span>BetterCharField<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> connection<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;char(</span><span class=\"si\">%s</span><span class=\"s1\">)&#39;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span>max_length\n\n<span class=\"c1\"># In the model:</span>\n<span class=\"k\">class</span> <span class=\"nc\">MyModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    my_field <span class=\"o\">=</span> BetterCharField<span class=\"p\">(</span><span class=\"mi\">25</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Akhirnya, jika kolom anda membutuhkan pengaturan SQL yang rumit, kembalikan <code class=\"docutils literal notranslate\">None</code> dari <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\">db_type()</code></a>. Ini akan menyebabkan kode pembuatan SQL Django melewati terhadap bidang ini. Anda kemudian bertanggung jawab untuk membuat kolom dalam tabel yang benar dalam cara lain, tentu saja, tetapi ini memberikan anda sebuah jalan untuk memberitahu Django untuk keluar dari jalan.</p>\n</section>\n<section id=\"converting-values-to-python-objects\">\n<span id=\"id2\"></span><h4>Mengubah nilai menjadi obyek Python<a class=\"heading-anchor\" href=\"#converting-values-to-python-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-changed\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.8</p><p>Sejarahnya, Django menyediakan kelas meta dipanggil <code class=\"docutils literal notranslate\">SubfieldBase</code> yang selalu dipanggil <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.to_python\" title=\"django.db.models.Field.to_python\"><code class=\"xref py py-meth docutils literal notranslate\">to_python()</code></a> pada penugasan. Ini tidak bermain dengan baik dengan perubahan basisdata disesuaikan, pengumpulan, atau permintaan nilai, jadi dia telah diganti dengan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.from_db_value\" title=\"django.db.models.Field.from_db_value\"><code class=\"xref py py-meth docutils literal notranslate\">from_db_value()</code></a>.</p>\n</aside>\n<p>Jika penyesuaian kelas <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> anda berhubungan dengan struktur dara yang lebih rumit daripada deretan karakter, tanggal, integer, atau float, kemudian anda butuh untuk mengesampingkan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.from_db_value\" title=\"django.db.models.Field.from_db_value\"><code class=\"xref py py-meth docutils literal notranslate\">from_db_value()</code></a> dan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.to_python\" title=\"django.db.models.Field.to_python\"><code class=\"xref py py-meth docutils literal notranslate\">to_python()</code></a>.</p>\n<p>Jika ada untuk bidang subkelas, <code class=\"docutils literal notranslate\">from_db_value()</code> akan dipanggil dalam semua keadaan ketika data dimuat dari basisdata, termasuk dalam keseluruhan dan panggilan <a class=\"reference internal\" href=\"/id/1.9/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\">values()</code></a>.</p>\n<p><code class=\"docutils literal notranslate\">to_python()</code> dipanggil dengan memutuskan dan selama cara <a class=\"reference internal\" href=\"/id/1.9/ref/models/instances/#django.db.models.Model.clean\" title=\"django.db.models.Model.clean\"><code class=\"xref py py-meth docutils literal notranslate\">clean()</code></a> digunakan dari formulir.</p>\n<p>Sebagai aturan umum, <code class=\"docutils literal notranslate\">to_python()</code> harus berurusan secara anggun dengan salah satu dari argumen berikut:</p>\n<ul class=\"simple\">\n<li><p>Sebuah instance dari jenis yang benar (sebagai contoh, <code class=\"docutils literal notranslate\">Hand</code> dalam contoh kami yang sedang berjalan).</p></li>\n<li><p>Sebuah string</p></li>\n<li><p><code class=\"docutils literal notranslate\">None</code> (jika bidang mengizinkan <code class=\"docutils literal notranslate\">null=True</code>)</p></li>\n</ul>\n<p>Dalam kelas <code class=\"docutils literal notranslate\">HandField</code>, kami menyimpan data sebagai bidang VARCHAR dalam basisdata, jadi kami butuh dapat mengolah deretan karakter dan <code class=\"docutils literal notranslate\">None</code> dalam <code class=\"docutils literal notranslate\">from_db_value()</code>. Di <code class=\"docutils literal notranslate\">to_python()</code>, kami butuh juga menangani instance <code class=\"docutils literal notranslate\">Hand</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span> <span class=\"nn\">re</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.exceptions</span> <span class=\"kn\">import</span> ValidationError\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> ugettext_lazy <span class=\"k\">as</span> _\n\n<span class=\"k\">def</span> <span class=\"nf\">parse_hand</span><span class=\"p\">(</span>hand_string<span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Takes a string of cards and splits into a full hand.&quot;&quot;&quot;</span>\n    p1 <span class=\"o\">=</span> re<span class=\"o\">.</span>compile<span class=\"p\">(</span><span class=\"s1\">&#39;.</span><span class=\"si\">{26}</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span>\n    p2 <span class=\"o\">=</span> re<span class=\"o\">.</span>compile<span class=\"p\">(</span><span class=\"s1\">&#39;..&#39;</span><span class=\"p\">)</span>\n    args <span class=\"o\">=</span> <span class=\"p\">[</span>p2<span class=\"o\">.</span>findall<span class=\"p\">(</span>x<span class=\"p\">)</span> <span class=\"k\">for</span> x <span class=\"ow\">in</span> p1<span class=\"o\">.</span>findall<span class=\"p\">(</span>hand_string<span class=\"p\">)]</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span>args<span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"mi\">4</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> ValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid input for a Hand instance&quot;</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> Hand<span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">)</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">HandField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">from_db_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">,</span> expression<span class=\"p\">,</span> connection<span class=\"p\">,</span> context<span class=\"p\">):</span>\n        <span class=\"k\">if</span> value <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> value\n        <span class=\"k\">return</span> parse_hand<span class=\"p\">(</span>value<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">to_python</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span>value<span class=\"p\">,</span> Hand<span class=\"p\">):</span>\n            <span class=\"k\">return</span> value\n\n        <span class=\"k\">if</span> value <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> value\n\n        <span class=\"k\">return</span> parse_hand<span class=\"p\">(</span>value<span class=\"p\">)</span>\n</code></pre></div>\n<p>Perhatikan bahwa kami selalu mengembalikan sebuah instance <code class=\"docutils literal notranslate\">hand</code> dari cara ini. Itu adalah jenis obyek Python kami ingin simpan dalam atribut model.</p>\n<p>Untuk <code class=\"docutils literal notranslate\">to_python()</code>, jika apapun berjalan salah selama perubahan nilai, anda harus memunculkan pengecualian <a class=\"reference internal\" href=\"/id/1.9/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\">ValidationError</code></a>.</p>\n</section>\n<section id=\"converting-python-objects-to-query-values\">\n<span id=\"id3\"></span><h4>Mengubah obyek Python ke nilai pencarian<a class=\"heading-anchor\" href=\"#converting-python-objects-to-query-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Sejak menggunakan sebuah basisdata membutuhkan perubahan dalam kedua jalan, jika anda mengesampingkan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.to_python\" title=\"django.db.models.Field.to_python\"><code class=\"xref py py-meth docutils literal notranslate\">to_python()</code></a> anda juga harus mengesampingkan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\">get_prep_value()</code></a> untuk merubah obyek Python kembali ke nilai permintaan.</p>\n<p>Sebagai contoh:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">HandField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_prep_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;&#39;</span><span class=\"o\">.</span>join<span class=\"p\">([</span><span class=\"s1\">&#39;&#39;</span><span class=\"o\">.</span>join<span class=\"p\">(</span>l<span class=\"p\">)</span> <span class=\"k\">for</span> l <span class=\"ow\">in</span> <span class=\"p\">(</span>value<span class=\"o\">.</span>north<span class=\"p\">,</span>\n                value<span class=\"o\">.</span>east<span class=\"p\">,</span> value<span class=\"o\">.</span>south<span class=\"p\">,</span> value<span class=\"o\">.</span>west<span class=\"p\">)])</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>Jika bidang penyesuaian anda menggunakan jenis <code class=\"docutils literal notranslate\">CHAR</code>, <code class=\"docutils literal notranslate\">VARCHAR</code> atau <code class=\"docutils literal notranslate\">TEXT</code> untuk MySQL, anda harus memastikan bahwa <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\">get_prep_value()</code></a> selalu mengembalikan jenis string. MySQL melakukan luwas dan pencocokan tidak diharapkan ketika sebuah permintaan dilakukan pada jenis ini dan nilai yang disediakan adalah sebauh integer, yang dapat menyebabkan permintaan untuk menyertakan obyek tidak diharapkan dalam pencarian mereka. Masalah ini tidak dapat timbul jika anda selalu mengembalikan jenis string dari <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\">get_prep_value()</code></a>.</p>\n</aside>\n</section>\n<section id=\"converting-query-values-to-database-values\">\n<span id=\"id4\"></span><h4>Mengubah nilai pencarian ke nilai basisdata<a class=\"heading-anchor\" href=\"#converting-query-values-to-database-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Beberapa jenis data (sebagai contoh, tanggal) butuh dalam bentuk yang khusus sebelum mereka dapat digunakan oleh backend basisdata. <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_db_prep_value\" title=\"django.db.models.Field.get_db_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\">get_db_prep_value()</code></a> adalah cara dimana perubahan tersebut harus dibuat. Hubungan khusus yang akan digunakan untuk permintaan dilewati sebagai parameter <code class=\"docutils literal notranslate\">connection</code>. Ini mengizinkan anda menggunakan logika perubahan khusus-backend jika dia diwajibkan.</p>\n<p>Sebagai contoh, Django menggunakan cara berikut untuk <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.BinaryField\" title=\"django.db.models.BinaryField\"><code class=\"xref py py-class docutils literal notranslate\">BinaryField</code></a> nya:</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\">def</span> <span class=\"nf\">get_db_prep_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">,</span> connection<span class=\"p\">,</span> prepared<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n    value <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span>BinaryField<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>get_db_prep_value<span class=\"p\">(</span>value<span class=\"p\">,</span> connection<span class=\"p\">,</span> prepared<span class=\"p\">)</span>\n    <span class=\"k\">if</span> value <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> connection<span class=\"o\">.</span>Database<span class=\"o\">.</span>Binary<span class=\"p\">(</span>value<span class=\"p\">)</span>\n    <span class=\"k\">return</span> value\n</code></pre></div>\n<p>Dalam kasus bidang penyesuaian anda butuh perubahan khusus ketika sedang disimpan yang tidak sama seperti perubahan digunakan untuk parameter permintaan biasa, anda dapat mengesampingkan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_db_prep_save\" title=\"django.db.models.Field.get_db_prep_save\"><code class=\"xref py py-meth docutils literal notranslate\">get_db_prep_save()</code></a>.</p>\n</section>\n<section id=\"preprocessing-values-before-saving\">\n<span id=\"id5\"></span><h4>Mengolah nilai sebelum menyimpan<a class=\"heading-anchor\" href=\"#preprocessing-values-before-saving\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Jika anda ingin prapengolahan nilai sebelum menyimpan, anda dapat menggunakan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.pre_save\" title=\"django.db.models.Field.pre_save\"><code class=\"xref py py-meth docutils literal notranslate\">pre_save()</code></a>. Sebagai contoh, <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a> Django menggunakan cara ini untuk menyetel atribut dengan benar dalam kasus dari <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\">auto_now</code></a> atau <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.DateField.auto_now_add\" title=\"django.db.models.DateField.auto_now_add\"><code class=\"xref py py-attr docutils literal notranslate\">auto_now_add</code></a>.</p>\n<p>Jika anda melakukan mengesampingkan cara ini, anda harus mengembalikan nilai dari atribut di akhirnya. Anda harus juga memperbaharui atribut model jika anda membuat perubahan apapun ke nilai sehingga kode menahan acuan ke model akan selalu melihat nilai benar.</p>\n</section>\n<section id=\"preparing-values-for-use-in-database-lookups\">\n<span id=\"id6\"></span><h4>Mempersiapkan nilai untuk digunakan dalam pencaian basisdata<a class=\"heading-anchor\" href=\"#preparing-values-for-use-in-database-lookups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Seperti perubahan nilai, menyiapkan sebauh nilai untuk pencarian basisdata adalah dua tingkatan pengolahan.</p>\n<p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_prep_lookup\" title=\"django.db.models.Field.get_prep_lookup\"><code class=\"xref py py-meth docutils literal notranslate\">get_prep_lookup()</code></a> melakukan tingkatan pertama dari persiapan pencarian: mengetik perubahan dan menmeriksa data.</p>\n<p>Menyiapkan <code class=\"docutils literal notranslate\">value</code> untuk dilewatkan ke basisdata ketika digunakan dalam pencarian (sebuah pembatas <code class=\"docutils literal notranslate\">WHERE</code> dalam SQL). Parameter <code class=\"docutils literal notranslate\">lookup_type</code> akan menjadi satu dari pencarian penyaring Django sah: <code class=\"docutils literal notranslate\">exact</code>, <code class=\"docutils literal notranslate\">iexact</code>, <code class=\"docutils literal notranslate\">contains</code>, <code class=\"docutils literal notranslate\">icontains</code>, <code class=\"docutils literal notranslate\">gt</code>, <code class=\"docutils literal notranslate\">gte</code>, <code class=\"docutils literal notranslate\">lt</code>, <code class=\"docutils literal notranslate\">lte</code>, <code class=\"docutils literal notranslate\">in</code>, <code class=\"docutils literal notranslate\">startswith</code>, <code class=\"docutils literal notranslate\">istartswith</code>, <code class=\"docutils literal notranslate\">endswith</code>, <code class=\"docutils literal notranslate\">iendswith</code>, <code class=\"docutils literal notranslate\">range</code>, <code class=\"docutils literal notranslate\">year</code>, <code class=\"docutils literal notranslate\">month</code>, <code class=\"docutils literal notranslate\">day</code>, <code class=\"docutils literal notranslate\">isnull</code>, <code class=\"docutils literal notranslate\">search</code>, <code class=\"docutils literal notranslate\">regex</code>, dan <code class=\"docutils literal notranslate\">iregex</code>.</p>\n<p>Jika anda sedang menggunakan <a class=\"reference internal\" href=\"/id/1.9/howto/custom-lookups/\"><span class=\"doc\">pencarian penyesuaian</span></a>, <code class=\"docutils literal notranslate\">lookup_type</code> dapat menjadi <code class=\"docutils literal notranslate\">lookup_name</code> apapun digunakan oleh pencarian penyesuaian proyek.</p>\n<p>Cara anda harus dipersiapkan untuk menangani semua nilai <code class=\"docutils literal notranslate\">lookup_type</code> ini dan harus menampilkan salah satu sebuah <code class=\"docutils literal notranslate\">ValueError</code> jika <code class=\"docutils literal notranslate\">value</code> dari urutan salah (sebuah daftar anda harapkan sebuah obyek, sebagai contoh) atau <code class=\"docutils literal notranslate\">TypeError</code> jika bidang anda tiadk mendukung jenis tersebut dari pencarian. Untuk banyak bidang-bidang, anda dapat mendapatkannya dengan menangani jenis pencarian yang butuh penanganan khusus untuk bidang anda dan sisa ke cara <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_db_prep_lookup\" title=\"django.db.models.Field.get_db_prep_lookup\"><code class=\"xref py py-meth docutils literal notranslate\">get_db_prep_lookup()</code></a> dari kelas induk.</p>\n<p>Jika anda butuh untuk menerapkan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_db_prep_save\" title=\"django.db.models.Field.get_db_prep_save\"><code class=\"xref py py-meth docutils literal notranslate\">get_db_prep_save()</code></a>, anda akan biasanya butuh menerapkan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_prep_lookup\" title=\"django.db.models.Field.get_prep_lookup\"><code class=\"xref py py-meth docutils literal notranslate\">get_prep_lookup()</code></a>. Jika anda tidak, <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\">get_prep_value()</code></a> akan dipanggil secara awal penerapan, untuk mengelola pencarian <code class=\"docutils literal notranslate\">exact</code>, <code class=\"docutils literal notranslate\">gt</code>, <code class=\"docutils literal notranslate\">gte</code>, <code class=\"docutils literal notranslate\">lt</code>, <code class=\"docutils literal notranslate\">lte</code>, <code class=\"docutils literal notranslate\">in</code> dan <code class=\"docutils literal notranslate\">range</code>.</p>\n<p>Anda juga ingin menerapkan cara ini untuk membatasi jensi pencarian yang dapat digunakan dengan jenis bidang penyesuaian anda.</p>\n<p>Catat bahwa, untuk pencarian <code class=\"docutils literal notranslate\">&quot;jangkauan&quot;</code> dan <code class=\"docutils literal notranslate\">&quot;dalam&quot;</code>, <code class=\"docutils literal notranslate\">get_prep_lookup</code> akan menerima sebuah daftar dari obyek (barangkali dari jenis yang benar) dan akan merubah mereka ke sebuah daftar dari jenis benar untuk melewatkan ke basisdata. Kebanyakan dari waktu, anda dapat menggunakan kembali <code class=\"docutils literal notranslate\">get_prep_value()</code>, atau setidaknya faktor luar beberapa potongan umum.</p>\n<p>Sebagai contoh, kode berikut menerapkan <code class=\"docutils literal notranslate\">get_prep_lookup</code> untuk membatasi jenis pencarian yang diterima terhadap <code class=\"docutils literal notranslate\">exact</code> dan <code class=\"docutils literal notranslate\">in</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\">HandField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_prep_lookup</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> lookup_type<span class=\"p\">,</span> value<span class=\"p\">):</span>\n        <span class=\"c1\"># We only handle &#39;exact&#39; and &#39;in&#39;. All others are errors.</span>\n        <span class=\"k\">if</span> lookup_type <span class=\"o\">==</span> <span class=\"s1\">&#39;exact&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_prep_value<span class=\"p\">(</span>value<span class=\"p\">)</span>\n        <span class=\"k\">elif</span> lookup_type <span class=\"o\">==</span> <span class=\"s1\">&#39;in&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span>get_prep_value<span class=\"p\">(</span>v<span class=\"p\">)</span> <span class=\"k\">for</span> v <span class=\"ow\">in</span> value<span class=\"p\">]</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s1\">&#39;Lookup type </span><span class=\"si\">%r</span><span class=\"s1\"> not supported.&#39;</span> <span class=\"o\">%</span> lookup_type<span class=\"p\">)</span>\n</code></pre></div>\n<p>Untuk melakukan perubahan data basisdata-khusus dibuatuhkan oleh sebauh pencarian, anda dapat mengesampingkan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_db_prep_lookup\" title=\"django.db.models.Field.get_db_prep_lookup\"><code class=\"xref py py-meth docutils literal notranslate\">get_db_prep_lookup()</code></a>.</p>\n</section>\n<section id=\"specifying-the-form-field-for-a-model-field\">\n<span id=\"specifying-form-field-for-model-field\"></span><h4>Menentukan bidang formulir untuk sebuah bidang model<a class=\"heading-anchor\" href=\"#specifying-the-form-field-for-a-model-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Untuk menyesuaiakan bidang formulir digunakan oleh <a class=\"reference internal\" href=\"/id/1.9/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a>, anda dapat mengesampingkan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.formfield\" title=\"django.db.models.Field.formfield\"><code class=\"xref py py-meth docutils literal notranslate\">formfield()</code></a>.</p>\n<p>Kelas bidang formulir dapat ditentukan melalui argumen <code class=\"docutils literal notranslate\">form_class</code> dan <code class=\"docutils literal notranslate\">choices_form_class</code>; yang terakhir digunakan jika bidang mempunyai pilihan yang ditentukan, yang depan kebalikannya. Jika argumen ini tidak disediakan, <a class=\"reference internal\" href=\"/id/1.9/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> atau <a class=\"reference internal\" href=\"/id/1.9/ref/forms/fields/#django.forms.TypedChoiceField\" title=\"django.forms.TypedChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">TypedChoiceField</code></a> akan digunakan.</p>\n<p>Semua kamus <code class=\"docutils literal notranslate\">kwargs</code> dilewatkan secara langsung ke formulir cara <code class=\"docutils literal notranslate\">__init__()</code> bidang. Biasanya, semua anda butuh lakukan adalah menyetel nilai awal bagus untuk <code class=\"docutils literal notranslate\">form_class</code> argumen (dan mungkin <code class=\"docutils literal notranslate\">choices_form_class</code>) dan kemudian mengutus penanganan lebih lanjut untuk kelas induk. Ini mungkin membutuhkan anda menulis bidang formulir penyesuaian (dan bahkan sebuah widget formulir). Lihat <a class=\"reference internal\" href=\"/id/1.9/topics/forms/\"><span class=\"doc\">forms documentation</span></a> untuk informasi tentang ini.</p>\n<p>Melanjutkan contoh berlangsung kita, kami dapat menulis cara <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.formfield\" title=\"django.db.models.Field.formfield\"><code class=\"xref py py-meth docutils literal notranslate\">formfield()</code></a> sebagai:</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\">HandField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">formfield</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"c1\"># This is a fairly standard way to set up some defaults</span>\n        <span class=\"c1\"># while letting the caller override them.</span>\n        defaults <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form_class&#39;</span><span class=\"p\">:</span> MyFormField<span class=\"p\">}</span>\n        defaults<span class=\"o\">.</span>update<span class=\"p\">(</span>kwargs<span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">(</span>HandField<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span>formfield<span class=\"p\">(</span><span class=\"o\">**</span>defaults<span class=\"p\">)</span>\n</code></pre></div>\n<p>Ini menganggap kami telah mengimpor kelas bidang <code class=\"docutils literal notranslate\">MyFormField</code> (yang mempunyai widget awal sendiri). Dokumen ini tidak mencakup rincian dari penulisan bidang formulir penyesuaian.</p>\n</section>\n<section id=\"emulating-built-in-field-types\">\n<span id=\"id7\"></span><h4>Menyamai jenis bidang siap pakai<a class=\"heading-anchor\" href=\"#emulating-built-in-field-types\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Jika anda telah membuat cara <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\">db_type()</code></a>, anda tidak butuh khawatir tentang <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_internal_type\" title=\"django.db.models.Field.get_internal_type\"><code class=\"xref py py-meth docutils literal notranslate\">get_internal_type()</code></a> -- dia tidak akan digunakan. Terkadang, meskipun, penyimpanan basisdata anda mirip dalam jenis pada beberapa bidang lain, jadi anda dapat menggunakan logika bidang lain itu untuk membuat kolum yang benar.</p>\n<p>Sebagai contoh:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">HandField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_internal_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;CharField&#39;</span>\n</code></pre></div>\n<p>Tidak penting backend basisdata anda kami gunakan, ini akan berarti bahwa <a class=\"reference internal\" href=\"/id/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> dan perintah SQL lainnya membuat jenis kolom benar untuk menyimpan sebuah deretan karakter.</p>\n<p>Jika <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.get_internal_type\" title=\"django.db.models.Field.get_internal_type\"><code class=\"xref py py-meth docutils literal notranslate\">get_internal_type()</code></a> megembalikan sebuah deretan karakter yang tidak diketahui ke Django untuk backend basisdata anda sedang gunakan -- yaitu, dia tidak muncul dalam <code class=\"docutils literal notranslate\">django.db.backends.&lt;db_name&gt;.base.DatabaseWrapper.data_types</code> -- deretan karakter akan masih digunakan oleh penyambung, tetapi cara <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\">db_type()</code></a> awal akan mengembalikan <code class=\"docutils literal notranslate\">None</code>. Lihat dokumentasi dari <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\">db_type()</code></a> untuk alasan mengapa ini mungkin berguna. menaruh sebuah gambaran deretan karakter kedalam sebagai jenis dari bidang untuk penyambung adalah ide berguna jika anda sedang akan menggunakan keluaran penyambung dalam beberapa tempat lainnya, diluar Django.</p>\n</section>\n<section id=\"converting-field-data-for-serialization\">\n<span id=\"converting-model-field-to-serialization\"></span><h4>Mengubah data field untuk serialisasi<a class=\"heading-anchor\" href=\"#converting-field-data-for-serialization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Untuk menyesuaikan bagaimana nilai disambung oleh penyambung, anda dapat mengesampingkan <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.value_to_string\" title=\"django.db.models.Field.value_to_string\"><code class=\"xref py py-meth docutils literal notranslate\">value_to_string()</code></a>. Menggunakan <code class=\"docutils literal notranslate\">value_from_object()</code> adalah jalan terbaik untuk mendapatkan nilai bidang sebelum penyambungan. Sebagai contoh, sejak <code class=\"docutils literal notranslate\">HandField</code> kami menggunakan deretan karakter untuk penyimpanan datanya, kami dapat menggunakan kembali beberapa kode perubahan yang ada:</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\">HandField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">value_to_string</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj<span class=\"p\">):</span>\n        value <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>value_from_object<span class=\"p\">(</span>obj<span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_prep_value<span class=\"p\">(</span>value<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"some-general-advice\">\n<h3>Beberapa saran umum<a class=\"heading-anchor\" href=\"#some-general-advice\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Menulis sebuah bidang penyesuaian dapat menjadi pengolahan yang rumit, khususnya jika anda sedang melakukan perubahan rumit diantara jenis Python anda dan basisdata anda dan bentuk penyambungan. Ini adalah sepasang tip utnuk membuat hal-hal berjalan lebih halus:</p>\n<ol class=\"arabic simple\">\n<li><p>Lihat bidang Django yang ada (dalam <code class=\"file docutils literal notranslate\">django/db/models/fields/__init__.py</code>) untuk inspirasi. Coba temukan bidang yang mirip pada apa anda inginkan dan perpanjang dia sedikit, daripada membuat sebuah keseluruhan bidang baru dari awal.</p></li>\n<li><p>Taruh sebuah cara <code class=\"docutils literal notranslate\">__str__()</code> (<code class=\"docutils literal notranslate\">__unicode__()</code> pada Python 2) pada kelas anda sedang bungkus sebagai sebuah bidang. Ada banyak tempat dimana kebiasaan awal dari kode bidang adalah memanggil <a class=\"reference internal\" href=\"/id/1.9/ref/utils/#django.utils.encoding.force_text\" title=\"django.utils.encoding.force_text\"><code class=\"xref py py-func docutils literal notranslate\">force_text()</code></a> pada nilai. (Dalam contoh kami di dokumen ini, <code class=\"docutils literal notranslate\">value</code> akan menjadi instance <code class=\"docutils literal notranslate\">Hand</code>, bukan sebuah <code class=\"docutils literal notranslate\">HandField</code>). Jadi jika cara <code class=\"docutils literal notranslate\">__str__()</code> anda (<code class=\"docutils literal notranslate\">__unicode__()</code> pada Python 2) otomatis merubah ke bentuk deretan karakter dari obyek Python anda, anda dapat menyimpan banyak pekerjaan.</p></li>\n</ol>\n</section>\n</section>\n<section id=\"writing-a-filefield-subclass\">\n<h2>Menulis subkelas <code class=\"docutils literal notranslate\">FileField</code><a class=\"heading-anchor\" href=\"#writing-a-filefield-subclass\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Dalam tambahan pada cara diatas, bidang-bidang yang berurusan dengan berkas-berkas mempunyai sedikit persyaratan khusus lainnya yang harus diambil kedalam akun. Kebanyakan dari mekanisme disediakan oleh <code class=\"docutils literal notranslate\">FileField</code>, seperti mengendalikan penyimpanan basisdata dan pengambilan, dapat tetap tidak berubah, meninggalkan subkelas-subkelas untuk berurusan dengan tantangan dari mendukung jenis khusus dari berkas.</p>\n<p>Django menyediakan sebuah kelas <code class=\"docutils literal notranslate\">File</code>, yang digunakan sebagai sebuah proxy pada isi berkas dan tindakan. Ini dapat disubkelaskan ke menyesuaikan bagaimana berkas diakses, dan cara apa yang tersedia. Dia tinggal di <code class=\"docutils literal notranslate\">django.db.models.fields.files</code>, dan kebiasaan awalnya adalah dijelaskan dalam <a class=\"reference internal\" href=\"/id/1.9/ref/files/file/\"><span class=\"doc\">file documentation</span></a>.</p>\n<p>Sekali sebuah subkelas dari <code class=\"docutils literal notranslate\">File</code> dibuat, subkelas <code class=\"docutils literal notranslate\">FileField</code> harus diberitahu untuk menggunakannya. Untuk melakukannya, cukup tetapkan subkelas <code class=\"docutils literal notranslate\">File</code> baru ke atribut <code class=\"docutils literal notranslate\">attr_class</code> khusus dari subkelas <code class=\"docutils literal notranslate\">FileField</code>.</p>\n<section id=\"a-few-suggestions\">\n<h3>Sedikit saran<a class=\"heading-anchor\" href=\"#a-few-suggestions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Sebagai tambahan pada rincian diatas, terdapat sedikit panduan yang dapat meningkatkan efisiensi dan kesiapan dari kode bidang.</p>\n<ol class=\"arabic simple\">\n<li><p>Sumber untuk <code class=\"docutils literal notranslate\">ImageField</code> sendiri Django (dalam <code class=\"docutils literal notranslate\">django/db/models/fields/files.py</code>) adalah contoh hebat dari bagaimana untuk mensubkelaskan <code class=\"docutils literal notranslate\">FileField</code> untuk mendukung jenis khusus dari berkas, karena menggabungkan semua teknik digambarkan diatas.</p></li>\n<li><p>Menembolok atribut berkas dimanapaun memungkinkan. Sejak berkas-berkas mungkin disimpan dalam sistem penyimpanan jauh, mengambil mereka mungkin memakan waktu tambahan, atau bahkan uang, yang tidak selalu dibutuhkan. Sekali sebuah berkas diambil untuk mendapatkan beberapa data tentang isinya, tembolok sebanyak mungkin data tersebut untuk mengurangi jumlah kali berkas harus diambil pada pemanggilan berikut untuk informasi itu.</p></li>\n</ol>\n</section>\n</section>","rootId":"writing-custom-model-fields","toc":[{"title":"Kata Pengantar","anchor":"introduction","children":[{"title":"Obyek contoh kami","anchor":"our-example-object","children":[]}]},{"title":"Latar belakang teori","anchor":"background-theory","children":[{"title":"Penyimpanan basisdata","anchor":"database-storage","children":[]},{"title":"Apakah yang kelas bidang lakukan?","anchor":"what-does-a-field-class-do","children":[]}]},{"title":"Menulis sebuah subkelas bidang","anchor":"writing-a-field-subclass","children":[{"title":"Membongkar bidang","anchor":"field-deconstruction","children":[]},{"title":"Changing a custom field's base class","anchor":"changing-a-custom-field-s-base-class","children":[]},{"title":"Mendokumentasikan bidang penyesuaian anda","anchor":"documenting-your-custom-field","children":[]},{"title":"Cara berguna","anchor":"useful-methods","children":[{"title":"Jenis basisdata penyesuaian","anchor":"custom-database-types","children":[]},{"title":"Mengubah nilai menjadi obyek Python","anchor":"converting-values-to-python-objects","children":[]},{"title":"Mengubah obyek Python ke nilai pencarian","anchor":"converting-python-objects-to-query-values","children":[]},{"title":"Mengubah nilai pencarian ke nilai basisdata","anchor":"converting-query-values-to-database-values","children":[]},{"title":"Mengolah nilai sebelum menyimpan","anchor":"preprocessing-values-before-saving","children":[]},{"title":"Mempersiapkan nilai untuk digunakan dalam pencaian basisdata","anchor":"preparing-values-for-use-in-database-lookups","children":[]},{"title":"Menentukan bidang formulir untuk sebuah bidang model","anchor":"specifying-the-form-field-for-a-model-field","children":[]},{"title":"Menyamai jenis bidang siap pakai","anchor":"emulating-built-in-field-types","children":[]},{"title":"Mengubah data field untuk serialisasi","anchor":"converting-field-data-for-serialization","children":[]}]},{"title":"Beberapa saran umum","anchor":"some-general-advice","children":[]}]},{"title":"Menulis subkelas FileField","anchor":"writing-a-filefield-subclass","children":[{"title":"Sedikit saran","anchor":"a-few-suggestions","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"Panduan \"Bagaimana\"","url":"/id/1.9/howto/"}],"prev":{"docname":"howto/custom-management-commands","title":"Menulis perintah django-admin penyesuaian","url":"/id/1.9/howto/custom-management-commands/"},"next":{"docname":"howto/custom-lookups","title":"Penyesuaian Pencarian","url":"/id/1.9/howto/custom-lookups/"},"formats":{"html":"/id/1.9/howto/custom-model-fields/","markdown":"/id/1.9/howto/custom-model-fields.md","json":"/id/1.9/howto/custom-model-fields.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/howto/custom-model-fields.txt","official":"https://docs.djangoproject.com/id/1.9/howto/custom-model-fields/","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"]}