{"title":"Menulis bidang model penyesuaian","version":"2.1","locale":"id","docname":"howto/custom-model-fields","url":"/id/2.1/howto/custom-model-fields/","canonical":"https://djangodocs.dev/id/2.1/howto/custom-model-fields/","summary":"Kata Pengantar Link to this heading # Dokumentasi model reference menjelaskan bagaimana menggunakan kelas-kelas bidang standar Django -- CharField , DateField ,…","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/2.1/topics/db/models/\"><span class=\"doc\">model reference</span></a> menjelaskan bagaimana menggunakan kelas-kelas bidang standar Django -- <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a>, <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></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\"><span class=\"pre\">VARCHAR</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">INTEGER</span></code>. Untuk lebih mengaburkan jenis kolom, seperti poligon geografis atau bahkan jenis dibuat-pengguna seperti <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/static/sql-createtype.html\">PostgreSQL custom types</a>, anda dapat menentukan subkelas-subkelas <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></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\"><span class=\"pre\">Field</span></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 untuk 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=\"w\"> </span><span class=\"nc\">Hand</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><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=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">north</span><span class=\"p\">,</span> <span class=\"n\">east</span><span class=\"p\">,</span> <span class=\"n\">south</span><span class=\"p\">,</span> <span class=\"n\">west</span><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><span class=\"n\">north</span> <span class=\"o\">=</span> <span class=\"n\">north</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">east</span> <span class=\"o\">=</span> <span class=\"n\">east</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">south</span> <span class=\"o\">=</span> <span class=\"n\">south</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">west</span> <span class=\"o\">=</span> <span class=\"n\">west</span>\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\"><span class=\"pre\">hand</span></code> pada model adalah sebuah contoh dari <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code>):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">example</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">example</span><span class=\"o\">.</span><span class=\"n\">hand</span><span class=\"o\">.</span><span class=\"n\">north</span><span class=\"p\">)</span>\n\n<span class=\"n\">new_hand</span> <span class=\"o\">=</span> <span class=\"n\">Hand</span><span class=\"p\">(</span><span class=\"n\">north</span><span class=\"p\">,</span> <span class=\"n\">east</span><span class=\"p\">,</span> <span class=\"n\">south</span><span class=\"p\">,</span> <span class=\"n\">west</span><span class=\"p\">)</span>\n<span class=\"n\">example</span><span class=\"o\">.</span><span class=\"n\">hand</span> <span class=\"o\">=</span> <span class=\"n\">new_hand</span>\n<span class=\"n\">example</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Kami memberikan dan mengambil dari atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">hand</span></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\"><span class=\"pre\">Hand</span></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\"><span class=\"pre\">hand</span></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\"><span class=\"pre\">datetime</span></code>, atau sesuatu lebih rumit seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></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\"><span class=\"pre\">Hand</span></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\"><span class=\"pre\">Hand</span></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/2.1/ref/forms/fields/\"><span class=\"doc\">form fields</span></a>) adalah subkelas dari <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.Field</span></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\"><span class=\"pre\">Field</span></code>. Kami akan memasuki rincian tepat dari <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> apa yang dapat dilakukan kemudian; untuk sekarang, cukuplah untuk mengatakan bahwa segala sesuatu turun dari <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></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\"><span class=\"pre\">Meta</span></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/2.1/topics/serialization/\"><span class=\"doc\">serializer</span></a>.</p>\n<p>Ingatlah ini ketika membuat penyesuaian bidang sendiri. Subkelas <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> Django anda tulis menyediakan mesin-mesin untuk merubah diantara contoh 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\"><span class=\"pre\">hand</span></code> dalam contoh kami.</p></li>\n<li><p>Kelas kedua adalah subkelas <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></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/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> anda, pertama berikan beberapa diduga yang mana ada kelas <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></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/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></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/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> (atau kelas induk anda).</p>\n<p>Dalam contoh kami, kami akan memanggil bidang <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>. (Adalah ide bagus untuk memanggil subkelas <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> anda <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;Something&gt;Field</span></code>, sehingga sangat mudah dicirikan sebagai sebuah subkelas <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a>.) Dia tidak berperilaku seperti bidang lainnya yang ada, jadi kami akan mensubkelaskan secara langsung dari <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n\n    <span class=\"n\">description</span> <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=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">kwargs</span><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><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></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/2.1/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> dan <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">auto_now</span></code></a> ke a <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.DateField</span></code></a> dan dia dengan mudah mengabaikan parameter <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> (<a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">auto_now</span></code></a> menjadi disiratkan <code class=\"docutils literal notranslate\"><span class=\"pre\">editable=False</span></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\"><span class=\"pre\">Field.__init__()</span></code> mengambil parameter berikut:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">verbose_name</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">nama</span></code></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">primary_key</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">max_length</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">blank</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">null</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">db_index</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">rel</span></code>: Digunakan untuk bidang terkait (seperti <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></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/2.1/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">serialize</span></code>: Jika <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, bidang tidak akan didisambungkan ketika model dilewatkan ke <a class=\"reference internal\" href=\"/id/2.1/topics/serialization/\"><span class=\"doc\">serializers</span></a> Django. Nilai awal ke <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">unique_for_date</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">unique_for_month</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">unique_for_year</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field.choices\" title=\"django.db.models.Field.choices\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">choices</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">help_text</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">db_column</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">db_tablespace</span></code></a>: hanya untuk pembuatan indeks, jika dukungan backend <a class=\"reference internal\" href=\"/id/2.1/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/2.1/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\"><span class=\"pre\">auto_created</span></code></a>: <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> jika bidang otomatis telah dibuat, adapun <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></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/2.1/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\"><span class=\"pre\">__init__()</span></code> anda adalah menulis cara <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code>. Cara ini mengatakan Django bagaimana mengambil instance dari bidang baru anda dan menguranginya untuk sebuah formulir yang disambungkan - khususnya, argumen apa untuk dilewatkan ke <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></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\"><span class=\"pre\">deconstruct()</span></code> baru. Jika, bagaimanapun, anda sedang merubah argumen dilewati dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> (seperti kami dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>), anda akan butuh tambahan nilai yang sedang dilewati.</p>\n<p>Kontrak dari <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></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\"><span class=\"pre\">deconstruct()</span></code> <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">Field</span></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\"><span class=\"pre\">HandField</span></code> kami selalu memaksa menyetel max_length dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code>. Cara <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> dalam basis kelas <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">kwargs</span><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><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">deconstruct</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">deconstruct</span><span class=\"p\">()</span>\n        <span class=\"k\">del</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;max_length&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span>\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\"><span class=\"pre\">kwargs</span></code></p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CommaSepField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><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=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">separator</span><span class=\"o\">=</span><span class=\"s2\">&quot;,&quot;</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">separator</span> <span class=\"o\">=</span> <span class=\"n\">separator</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">deconstruct</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">deconstruct</span><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><span class=\"n\">separator</span> <span class=\"o\">!=</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"p\">:</span>\n            <span class=\"n\">kwargs</span><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><span class=\"n\">separator</span>\n        <span class=\"k\">return</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span>\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\"><span class=\"pre\">deconstruct()</span></code> harus mengembalikan argumen yang anda dapat lewati ke <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></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\"><span class=\"pre\">Field</span></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><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span> <span class=\"o\">=</span> <span class=\"n\">my_field_instance</span><span class=\"o\">.</span><span class=\"n\">deconstruct</span><span class=\"p\">()</span>\n<span class=\"n\">new_instance</span> <span class=\"o\">=</span> <span class=\"n\">MyField</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n<span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">my_field_instance</span><span class=\"o\">.</span><span class=\"n\">some_attribute</span><span class=\"p\">,</span> <span class=\"n\">new_instance</span><span class=\"o\">.</span><span class=\"n\">some_attribute</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"changing-a-custom-field-s-base-class\">\n<h3>Merubah penyesuaian kelas dasar bidang<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>Anda tidak dapat merubah kelas dasar dari penyesuaian bidang karena Django tidak akan mengenali perubahan dan buat perpindahan untuknya. Sebagai contoh, jika anda mulai dengan:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomCharField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>dan kemudian ditentukan bahwa anda ingin menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> sebagai gantinya, anda tidak dapat merubah subkelas 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=\"w\"> </span><span class=\"nc\">CustomCharField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Sebagai gantinya, anda harus membuat kelas bidang penyesuaian baru dan perbaharui model anda untuk mengacunya:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomCharField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomTextField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Seperti diobrolkan di <a class=\"reference internal\" href=\"/id/2.1/topics/migrations/#migrations-removing-model-fields\"><span class=\"std std-ref\">removing fields</span></a>, anda harus memelihara kelas <code class=\"docutils literal notranslate\"><span class=\"pre\">CustomCharField</span></code> asli selama anda mempunyai perpindahan yang mengacunya.</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/2.1/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/2.1/ref/models/fields/#django.db.models.Field.description\" title=\"django.db.models.Field.description\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">description</span></code></a> dari bidang penyesuaian anda. Dalam contoh diatas, gambaran ditampilkan oleh aplikasi <code class=\"docutils literal notranslate\"><span class=\"pre\">admindocs</span></code> untuk sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> akan menjadi 'Sebuah tangan dari kartu (gaya bridge)'.</p>\n<p>Dalam tampilan <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">django.contrib.admindocs</span></code></a>, gambaran bidang ditambahkan dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">field.__dict__</span></code> yang mengizinkan gambaran pada argumen yang digabungkan dari bidang. Sebagai contoh, gambaran untuk <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></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><span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"n\">_</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/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> anda, anda boleh mempertimbangkan mengutamakan sedikit metode standar, tergantung pada perilaku 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\"><span class=\"pre\">mtype</span></code>. Anda dapat mensubkelaskan <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> dan menerapkan cara <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">db_type()</span></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MytypeField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><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\"><span class=\"pre\">MytypeField</span></code>, anda dapat menggunakannya di model apapun, seperti jenis <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></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=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">80</span><span class=\"p\">)</span>\n    <span class=\"n\">something_else</span> <span class=\"o\">=</span> <span class=\"n\">MytypeField</span><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\"><span class=\"pre\">timestamp</span></code>, sementara kolom yang sama dalam MySQL dipanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>. Jalan termudah untuk menangani ini dalam cara <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">db_type()</span></code></a> adalah untuk memeriksa atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.settings_dict['ENGINE']</span></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=\"w\"> </span><span class=\"nc\">MyDateField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">settings_dict</span><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/2.1/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\"><span class=\"pre\">db_type()</span></code></a> dan <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field.rel_db_type\" title=\"django.db.models.Field.rel_db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">rel_db_type()</span></code></a> dipanggil oleh Django ketika kerangka kerja membangun pernyataan <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code> untuk aplikasi anda -- yaitu, ketika anda pertama membuat tabel anda. Cara-cara juga dipanggil ketika membangun ketentuan <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> yang menyertakan bidang model -- yaitu, ketika anda mengambil data menggunakan cara QuerySet seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> dan mempunyai bidang model sebagai sebuah argumen. Mereka tidak dipanggil pada waktu lain, jadi dia dapat mampu menjalankan sedikit kode rumit, seperti pemeriksaan <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.settings_dict</span></code> di contoh diatas.</p>\n<p>Beberapa jenis kolom basisdata menerima parameter, seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">CHAR(25)</span></code>, dimana parameter <code class=\"docutils literal notranslate\"><span class=\"pre\">25</span></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\"><span class=\"pre\">db_type()</span></code>. Sebagai contoh, dia tidak akan masuk akan untuk mempunyai <code class=\"docutils literal notranslate\"><span class=\"pre\">CharMaxlength25Field</span></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=\"w\"> </span><span class=\"nc\">CharMaxlength25Field</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><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=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">my_field</span> <span class=\"o\">=</span> <span class=\"n\">CharMaxlength25Field</span><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\"><span class=\"pre\">Field.__init__()</span></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=\"w\"> </span><span class=\"nc\">BetterCharField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">max_length</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_length</span> <span class=\"o\">=</span> <span class=\"n\">max_length</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><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><span class=\"n\">max_length</span>\n\n<span class=\"c1\"># In the model:</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">my_field</span> <span class=\"o\">=</span> <span class=\"n\">BetterCharField</span><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\"><span class=\"pre\">None</span></code> dari <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">db_type()</span></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<p>Cara <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field.rel_db_type\" title=\"django.db.models.Field.rel_db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">rel_db_type()</span></code></a> dipanggil oleh bidang seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code> yang menunjuk ke bidang lain untuk menentukan jenis data kolom basisdata mereka. Sebagai contoh, jika anda mempunyai sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">UnsignedAutoField</span></code>, anda juga butuh foreign key yang menunjuk ke bidang itu untuk menggunakan jenis data yang sama:</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\"># MySQL unsigned integer (range 0 to 4294967295).</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">UnsignedAutoField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">AutoField</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;integer UNSIGNED AUTO_INCREMENT&#39;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">rel_db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;integer UNSIGNED&#39;</span>\n</code></pre></div>\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<p>Jika penyesuaian kelas <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> anda berhubungan dengan struktur dara yang lebih rumit daripada string, date, integer, atau float, kemudian anda butuh untuk menimpa <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">from_db_value()</span></code></a> dan <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">to_python()</span></code></a>.</p>\n<p>Jika ada untuk bidang subkelas, <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code> akan dipanggil dalam semua keadaan ketika data dimuat dari basisdata, termasuk dalam keseluruhan dan panggilan <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">values()</span></code></a>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code> dipanggil dengan memutuskan dan selama cara <a class=\"reference internal\" href=\"/id/2.1/ref/models/instances/#django.db.models.Model.clean\" title=\"django.db.models.Model.clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">clean()</span></code></a> digunakan dari formulir.</p>\n<p>Sebagai aturan umum, <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code> harus berurusan secara anggun dengan salah satu dari argumen berikut:</p>\n<ul class=\"simple\">\n<li><p>Sebuah contoh dari jenis yang benar (sebagai contoh, <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> dalam contoh kami yang sedang berjalan).</p></li>\n<li><p>Sebuah string</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (jika bidang mengizinkan <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>)</p></li>\n</ul>\n<p>Dalam kelas <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>, kami menyimpan data sebagai bidang VARCHAR dalam basisdata, jadi kami butuh dapat mengolah deretan karakter dan <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code>. Di <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, kami butuh juga menangani instance <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">re</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ValidationError</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">hand_string</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;Takes a string of cards and splits into a full hand.&quot;&quot;&quot;</span>\n    <span class=\"n\">p1</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s1\">&#39;.</span><span class=\"si\">{26}</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">p2</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s1\">&#39;..&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">p2</span><span class=\"o\">.</span><span class=\"n\">findall</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">p1</span><span class=\"o\">.</span><span class=\"n\">findall</span><span class=\"p\">(</span><span class=\"n\">hand_string</span><span class=\"p\">)]</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"mi\">4</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</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> <span class=\"n\">Hand</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">from_db_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">expression</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n        <span class=\"k\">return</span> <span class=\"n\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">to_python</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">Hand</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n\n        <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n\n        <span class=\"k\">return</span> <span class=\"n\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Perhatikan bahwa kami selalu mengembalikan sebuah instance <code class=\"docutils literal notranslate\"><span class=\"pre\">hand</span></code> dari cara ini. Itu adalah jenis obyek Python kami ingin simpan dalam atribut model.</p>\n<p>Untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, jika apapun berjalan salah selama perubahan nilai, anda harus memunculkan pengecualian <a class=\"reference internal\" href=\"/id/2.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></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 menimpa <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">to_python()</span></code></a> anda juga harus menimpa <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">get_prep_value()</span></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=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_prep_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">([</span><span class=\"s1\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">l</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">l</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">north</span><span class=\"p\">,</span>\n                <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">east</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">south</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">west</span><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\"><span class=\"pre\">CHAR</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">TEXT</span></code> untuk MySQL, anda harus memastikan bahwa <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">get_prep_value()</span></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 sebuah 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/2.1/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\"><span class=\"pre\">get_prep_value()</span></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/2.1/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\"><span class=\"pre\">get_db_prep_value()</span></code></a> adalah cara dimana perubahan tersebut harus dibuat. Hubungan khusus yang akan digunakan untuk permintaan dilewati sebagai parameter <code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></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/2.1/ref/models/fields/#django.db.models.BinaryField\" title=\"django.db.models.BinaryField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BinaryField</span></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=\"w\"> </span><span class=\"nf\">get_db_prep_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">,</span> <span class=\"n\">prepared</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n    <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_db_prep_value</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">,</span> <span class=\"n\">prepared</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">value</span> <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> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">Database</span><span class=\"o\">.</span><span class=\"n\">Binary</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">value</span>\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 menimpa <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">get_db_prep_save()</span></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/2.1/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\"><span class=\"pre\">pre_save()</span></code></a>. Sebagai contoh, <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a> Django menggunakan cara ini untuk menyetel atribut dengan benar dalam kasus dari <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">auto_now</span></code></a> atau <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">auto_now_add</span></code></a>.</p>\n<p>Jika anda melakukan menimpa metode 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=\"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 menyesuaikan bidang formulir digunakan oleh <a class=\"reference internal\" href=\"/id/2.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code></a>, anda dapat menimpa <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field.formfield\" title=\"django.db.models.Field.formfield\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">formfield()</span></code></a>.</p>\n<p>Kelas bidang formulir dapat ditentukan melalui argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">choices_form_class</span></code>; yang terakhir digunakan jika bidang mempunyai pilihan yang ditentukan, yang depan kebalikannya. Jika argumen ini tidak disediakan, <a class=\"reference internal\" href=\"/id/2.1/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> atau <a class=\"reference internal\" href=\"/id/2.1/ref/forms/fields/#django.forms.TypedChoiceField\" title=\"django.forms.TypedChoiceField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TypedChoiceField</span></code></a> akan digunakan.</p>\n<p>Semua kamus <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> dilewatkan secara langsung ke formulir cara <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> bidang. Biasanya, semua anda butuh lakukan adalah menyetel nilai awal bagus untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> argumen (dan mungkin <code class=\"docutils literal notranslate\"><span class=\"pre\">choices_form_class</span></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/2.1/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/2.1/ref/models/fields/#django.db.models.Field.formfield\" title=\"django.db.models.Field.formfield\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">formfield()</span></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=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">formfield</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><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        <span class=\"n\">defaults</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form_class&#39;</span><span class=\"p\">:</span> <span class=\"n\">MyFormField</span><span class=\"p\">}</span>\n        <span class=\"n\">defaults</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">formfield</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">defaults</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ini menganggap kami telah mengimpor kelas bidang <code class=\"docutils literal notranslate\"><span class=\"pre\">MyFormField</span></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=\"id6\"></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/2.1/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\"><span class=\"pre\">db_type()</span></code></a>, anda tidak butuh khawatir tentang <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">get_internal_type()</span></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=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </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/2.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></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/2.1/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\"><span class=\"pre\">get_internal_type()</span></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\"><span class=\"pre\">django.db.backends.&lt;db_name&gt;.base.DatabaseWrapper.data_types</span></code> -- deretan karakter akan masih digunakan oleh penyambung, tetapi cara <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">db_type()</span></code></a> awal akan mengembalikan <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Lihat dokumentasi dari <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">db_type()</span></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 diserialkan oleh penserial, anda dapat menimpa <a class=\"reference internal\" href=\"/id/2.1/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\"><span class=\"pre\">value_to_string()</span></code></a>. menggunakan <a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.Field.value_from_object\" title=\"django.db.models.Field.value_from_object\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">value_from_object()</span></code></a> adalah jalan terbaik untuk mendapatkan nilai bidang sebelum serialisasi. Sebagai contoh, sejak <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> menggunakan string untuk penyimpanan data, 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=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">value_to_string</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n        <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">value_from_object</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_prep_value</span><span class=\"p\">(</span><span class=\"n\">value</span><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 untuk 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\"><span class=\"pre\">django/db/models/fields/__init__.py</span></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 metode <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> pada kelas anda sedang bungkus sebagai sebuah bidang. Ada banyak tempat-tempat dimana perilaku awalan dari kode bidang adalah memanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">str()</span></code> pada nilai. (Dalam contoh kami dalam dokumen ini, <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> akan berupa instance <code class=\"docutils literal notranslate\"><span class=\"pre\">handa</span></code>, bukan <code class=\"docutils literal notranslate\"><span class=\"pre\">handField</span></code>). Jadi jika metode <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> anda secara otomatis merubah ke bentuk string dari obyek Python anda, anda dapat menyimpan anda sendiri 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\"><span class=\"pre\">FileField</span></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\"><span class=\"pre\">FileField</span></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\"><span class=\"pre\">File</span></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\"><span class=\"pre\">django.db.models.fields.files</span></code>, dan kebiasaan awalnya adalah dijelaskan dalam <a class=\"reference internal\" href=\"/id/2.1/ref/files/file/\"><span class=\"doc\">file documentation</span></a>.</p>\n<p>Sekali sebuah subkelas dari <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> dibuat, subkelas <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> harus diberitahu untuk menggunakannya. Untuk melakukannya, cukup tetapkan subkelas <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> baru ke atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">attr_class</span></code> khusus dari subkelas <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></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\"><span class=\"pre\">ImageField</span></code> sendiri Django (dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">django/db/models/fields/files.py</span></code>) adalah contoh hebat dari bagaimana untuk mensubkelaskan <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></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, simpan 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":"Merubah penyesuaian kelas dasar bidang","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":"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/2.1/howto/"}],"prev":{"docname":"howto/custom-management-commands","title":"Menulis perintah django-admin penyesuaian","url":"/id/2.1/howto/custom-management-commands/"},"next":{"docname":"howto/custom-lookups","title":"Penyesuaian Pencarian","url":"/id/2.1/howto/custom-lookups/"},"formats":{"html":"/id/2.1/howto/custom-model-fields/","markdown":"/id/2.1/howto/custom-model-fields.md","json":"/id/2.1/howto/custom-model-fields.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/howto/custom-model-fields.txt","official":"https://docs.djangoproject.com/id/2.1/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","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}