{"title":"Writing custom model fields","version":"1.9","locale":"es","docname":"howto/custom-model-fields","url":"/es/1.9/howto/custom-model-fields/","canonical":"https://djangodocs.dev/es/1.9/howto/custom-model-fields/","summary":"Introduction Link to this heading # The model reference documentation explains how to use Django’s standard field classes – CharField , DateField , etc. For many…","html":"<h1>Writing custom model fields<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>Introduction<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The <a class=\"reference internal\" href=\"/es/1.9/topics/db/models/\"><span class=\"doc\">model reference</span></a> documentation explains how to use\nDjango’s standard field classes – <a class=\"reference internal\" href=\"/es/1.9/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>,\n<a class=\"reference internal\" href=\"/es/1.9/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>, etc. For many purposes, those classes are\nall you’ll need. Sometimes, though, the Django version won’t meet your precise\nrequirements, or you’ll want to use a field that is entirely different from\nthose shipped with Django.</p>\n<p>Django’s built-in field types don’t cover every possible database column type –\nonly the common types, such as <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">INTEGER</span></code>. For more obscure\ncolumn types, such as geographic polygons or even user-created types such as\n<a class=\"reference external\" href=\"http://www.postgresql.org/docs/current/interactive/sql-createtype.html\">PostgreSQL custom types</a>, you can define your own Django <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> subclasses.</p>\n<p>Alternatively, you may have a complex Python object that can somehow be\nserialized to fit into a standard database column type. This is another case\nwhere a <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> subclass will help you use your object with your models.</p>\n<section id=\"our-example-object\">\n<h3>Our example object<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>Creating custom fields requires a bit of attention to detail. To make things\neasier to follow, we’ll use a consistent example throughout this document:\nwrapping a Python object representing the deal of cards in a hand of <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Contract_bridge\">Bridge</a>.\nDon’t worry, you don’t have to know how to play Bridge to follow this example.\nYou only need to know that 52 cards are dealt out equally to four players, who\nare traditionally called <em>north</em>, <em>east</em>, <em>south</em> and <em>west</em>.  Our class looks\nsomething like this:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Hand</span><span class=\"p\">(</span><span class=\"nb\">object</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>This is just an ordinary Python class, with nothing Django-specific about it.\nWe’d like to be able to do things like this in our models (we assume the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">hand</span></code> attribute on the model is an instance of <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>We assign to and retrieve from the <code class=\"docutils literal notranslate\"><span class=\"pre\">hand</span></code> attribute in our model just like\nany other Python class. The trick is to tell Django how to handle saving and\nloading such an object.</p>\n<p>In order to use the <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> class in our models, we <strong>do not</strong> have to change\nthis class at all. This is ideal, because it means you can easily write\nmodel support for existing classes where you cannot change the source code.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>You might only be wanting to take advantage of custom database column\ntypes and deal with the data as standard Python types in your models;\nstrings, or floats, for example. This case is similar to our <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code>\nexample and we’ll note any differences as we go along.</p>\n</aside>\n</section>\n</section>\n<section id=\"background-theory\">\n<h2>Background theory<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>Database storage<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>The simplest way to think of a model field is that it provides a way to take a\nnormal Python object – string, boolean, <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>, or something more\ncomplex like <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> – and convert it to and from a format that is useful\nwhen dealing with the database (and serialization, but, as we’ll see later,\nthat falls out fairly naturally once you have the database side under control).</p>\n<p>Fields in a model must somehow be converted to fit into an existing database\ncolumn type. Different databases provide different sets of valid column types,\nbut the rule is still the same: those are the only types you have to work\nwith. Anything you want to store in the database must fit into one of\nthose types.</p>\n<p>Normally, you’re either writing a Django field to match a particular database\ncolumn type, or there’s a fairly straightforward way to convert your data to,\nsay, a string.</p>\n<p>For our <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> example, we could convert the card data to a string of 104\ncharacters by concatenating all the cards together in a pre-determined order –\nsay, all the <em>north</em> cards first, then the <em>east</em>, <em>south</em> and <em>west</em> cards. So\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> objects can be saved to text or character columns in the database.</p>\n</section>\n<section id=\"what-does-a-field-class-do\">\n<h3>What does a field class do?<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>All of Django’s fields (and when we say <em>fields</em> in this document, we always\nmean model fields and not <a class=\"reference internal\" href=\"/es/1.9/ref/forms/fields/\"><span class=\"doc\">form fields</span></a>) are subclasses\nof <a class=\"reference internal\" href=\"/es/1.9/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>. Most of the information that Django records\nabout a field is common to all fields – name, help text, uniqueness and so\nforth. Storing all that information is handled by <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>. We’ll get into the\nprecise details of what <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> can do later on; for now, suffice it to say\nthat everything descends from <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> and then customizes key pieces of the\nclass behavior.</p>\n<p>It’s important to realize that a Django field class is not what is stored in\nyour model attributes. The model attributes contain normal Python objects. The\nfield classes you define in a model are actually stored in the <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> class\nwhen the model class is created (the precise details of how this is done are\nunimportant here). This is because the field classes aren’t necessary when\nyou’re just creating and modifying attributes. Instead, they provide the\nmachinery for converting between the attribute value and what is stored in the\ndatabase or sent to the <a class=\"reference internal\" href=\"/es/1.9/topics/serialization/\"><span class=\"doc\">serializer</span></a>.</p>\n<p>Keep this in mind when creating your own custom fields. The Django <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>\nsubclass you write provides the machinery for converting between your Python\ninstances and the database/serializer values in various ways (there are\ndifferences between storing a value and using a value for lookups, for\nexample). If this sounds a bit tricky, don’t worry – it will become clearer in\nthe examples below. Just remember that you will often end up creating two\nclasses when you want a custom field:</p>\n<ul class=\"simple\">\n<li><p>The first class is the Python object that your users will manipulate.\nThey will assign it to the model attribute, they will read from it for\ndisplaying purposes, things like that. This is the <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> class in our\nexample.</p></li>\n<li><p>The second class is the <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> subclass. This is the class that knows\nhow to convert your first class back and forth between its permanent\nstorage form and the Python form.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"writing-a-field-subclass\">\n<h2>Writing a field subclass<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>When planning your <a class=\"reference internal\" href=\"/es/1.9/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> subclass, first give some\nthought to which existing <a class=\"reference internal\" href=\"/es/1.9/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> class your new field\nis most similar to. Can you subclass an existing Django field and save yourself\nsome work? If not, you should subclass the <a class=\"reference internal\" href=\"/es/1.9/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>\nclass, from which everything is descended.</p>\n<p>Initializing your new field is a matter of separating out any arguments that are\nspecific to your case from the common arguments and passing the latter to the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> method of <a class=\"reference internal\" href=\"/es/1.9/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> (or your parent\nclass).</p>\n<p>In our example, we’ll call our field <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>. (It’s a good idea to call\nyour <a class=\"reference internal\" href=\"/es/1.9/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> subclass <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;Something&gt;Field</span></code>, so it’s\neasily identifiable as a <a class=\"reference internal\" href=\"/es/1.9/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> subclass.) It doesn’t\nbehave like any existing field, so we’ll subclass directly from\n<a class=\"reference internal\" href=\"/es/1.9/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=\"n\">HandField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><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>Our <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> accepts most of the standard field options (see the list\nbelow), but we ensure it has a fixed length, since it only needs to hold 52\ncard values plus their suits; 104 characters in total.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Many of Django’s model fields accept options that they don’t do anything\nwith. For example, you can pass both\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> and\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_now</span></code></a> to a\n<a class=\"reference internal\" href=\"/es/1.9/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> and it will simply ignore the\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> parameter\n(<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_now</span></code></a> being set implies\n<code class=\"docutils literal notranslate\"><span class=\"pre\">editable=False</span></code>). No error is raised in this case.</p>\n<p>This behavior simplifies the field classes, because they don’t need to\ncheck for options that aren’t necessary. They just pass all the options to\nthe parent class and then don’t use them later on. It’s up to you whether\nyou want your fields to be more strict about the options they select, or to\nuse the simpler, more permissive behavior of the current fields.</p>\n</aside>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">Field.__init__()</span></code> method takes the following parameters:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.verbose_name\" title=\"django.db.models.Field.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">primary_key</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.CharField.max_length\" title=\"django.db.models.CharField.max_length\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">max_length</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">blank</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">null</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.db_index\" title=\"django.db.models.Field.db_index\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_index</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">rel</span></code>: Used for related fields (like <a class=\"reference internal\" href=\"/es/1.9/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>). For advanced\nuse only.</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">default</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">serialize</span></code>: If <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, the field will not be serialized when the model\nis passed to Django’s <a class=\"reference internal\" href=\"/es/1.9/topics/serialization/\"><span class=\"doc\">serializers</span></a>. Defaults to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.unique_for_date\" title=\"django.db.models.Field.unique_for_date\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_for_date</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.unique_for_month\" title=\"django.db.models.Field.unique_for_month\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_for_month</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.unique_for_year\" title=\"django.db.models.Field.unique_for_year\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_for_year</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.choices\" title=\"django.db.models.Field.choices\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">choices</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.help_text\" title=\"django.db.models.Field.help_text\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">help_text</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.db_column\" title=\"django.db.models.Field.db_column\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_column</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.db_tablespace\" title=\"django.db.models.Field.db_tablespace\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_tablespace</span></code></a>: Only for index creation, if the\nbackend supports <a class=\"reference internal\" href=\"/es/1.9/topics/db/tablespaces/\"><span class=\"doc\">tablespaces</span></a>. You can usually\nignore this option.</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.auto_created\" title=\"django.db.models.Field.auto_created\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_created</span></code></a>: <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if the field was\nautomatically created, as for the <a class=\"reference internal\" href=\"/es/1.9/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>\nused by model inheritance. For advanced use only.</p></li>\n</ul>\n<p>All of the options without an explanation in the above list have the same\nmeaning they do for normal Django fields. See the <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/\"><span class=\"doc\">field documentation</span></a> for examples and details.</p>\n<section id=\"field-deconstruction\">\n<span id=\"custom-field-deconstruct-method\"></span><h3>Field deconstruction<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>The counterpoint to writing your <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> method is writing the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> method. This method tells Django how to take an instance\nof your new field and reduce it to a serialized form - in particular, what\narguments to pass to <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> to re-create it.</p>\n<p>If you haven’t added any extra options on top of the field you inherited from,\nthen there’s no need to write a new <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> method. If, however,\nyou’re changing the arguments passed in <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> (like we are in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>), you’ll need to supplement the values being passed.</p>\n<p>The contract of <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> is simple; it returns a tuple of four items:\nthe field’s attribute name, the full import path of the field class, the\npositional arguments (as a list), and the keyword arguments (as a dict). Note\nthis is different from the <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> method <a class=\"reference internal\" href=\"/es/1.9/topics/migrations/#custom-deconstruct-method\"><span class=\"std std-ref\">for custom classes</span></a> which returns a tuple of three things.</p>\n<p>As a custom field author, you don’t need to care about the first two values;\nthe base <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> class has all the code to work out the field’s attribute\nname and import path. You do, however, have to care about the positional\nand keyword arguments, as these are likely the things you are changing.</p>\n<p>For example, in our <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> class we’re always forcibly setting\nmax_length in <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code>. The <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> method on the base <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>\nclass will see this and try to return it in the keyword arguments; thus,\nwe can drop it from the keyword arguments for readability:</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=\"n\">HandField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><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=\"n\">HandField</span><span class=\"p\">,</span> <span class=\"bp\">self</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>If you add a new keyword argument, you need to write code to put its value\ninto <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> yourself:</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=\"n\">CommaSepField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><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=\"n\">CommaSepField</span><span class=\"p\">,</span> <span class=\"bp\">self</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>More complex examples are beyond the scope of this document, but remember -\nfor any configuration of your Field instance, <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> must return\narguments that you can pass to <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> to reconstruct that state.</p>\n<p>Pay extra attention if you set new default values for arguments in the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> superclass; you want to make sure they’re always included, rather\nthan disappearing if they take on the old default value.</p>\n<p>In addition, try to avoid returning values as positional arguments; where\npossible, return values as keyword arguments for maximum future compatibility.\nOf course, if you change the names of things more often than their position\nin the constructor’s argument list, you might prefer positional, but bear in\nmind that people will be reconstructing your field from the serialized version\nfor quite a while (possibly years), depending how long your migrations live for.</p>\n<p>You can see the results of deconstruction by looking in migrations that include\nthe field, and you can test deconstruction in unit tests by just deconstructing\nand reconstructing the field:</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>Changing a custom field’s base class<a class=\"heading-anchor\" href=\"#changing-a-custom-field-s-base-class\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You can’t change the base class of a custom field because Django won’t detect\nthe change and make a migration for it. For example, if you start with:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"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>and then decide that you want to use <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> instead, you can’t change\nthe subclass like this:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"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>Instead, you must create a new custom field class and update your models to\nreference it:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"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>As discussed in <a class=\"reference internal\" href=\"/es/1.9/topics/migrations/#migrations-removing-model-fields\"><span class=\"std std-ref\">removing fields</span></a>, you\nmust retain the original <code class=\"docutils literal notranslate\"><span class=\"pre\">CustomCharField</span></code> class as long as you have\nmigrations that reference it.</p>\n</section>\n<section id=\"documenting-your-custom-field\">\n<h3>Documenting your custom field<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>As always, you should document your field type, so users will know what it is.\nIn addition to providing a docstring for it, which is useful for developers,\nyou can also allow users of the admin app to see a short description of the\nfield type via the <a class=\"reference internal\" href=\"/es/1.9/ref/contrib/admin/admindocs/\"><span class=\"doc\">django.contrib.admindocs</span></a> application. To do this simply provide\ndescriptive text in a <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.description\" title=\"django.db.models.Field.description\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">description</span></code></a> class attribute of your custom\nfield. In the above example, the description displayed by the <code class=\"docutils literal notranslate\"><span class=\"pre\">admindocs</span></code>\napplication for a <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> will be “A hand of cards (bridge style)”.</p>\n<p>In the <a class=\"reference internal\" href=\"/es/1.9/ref/contrib/admin/admindocs/#module-django.contrib.admindocs\" title=\"django.contrib.admindocs: Django's admin documentation generator.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.admindocs</span></code></a> display, the field description is\ninterpolated with <code class=\"docutils literal notranslate\"><span class=\"pre\">field.__dict__</span></code> which allows the description to\nincorporate arguments of the field. For example, the description for\n<a class=\"reference internal\" href=\"/es/1.9/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> is:</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>Useful methods<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>Once you’ve created your <a class=\"reference internal\" href=\"/es/1.9/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> subclass, you might\nconsider overriding a few standard methods, depending on your field’s behavior.\nThe list of methods below is in approximately decreasing order of importance,\nso start from the top.</p>\n<section id=\"custom-database-types\">\n<span id=\"id1\"></span><h4>Custom database types<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>Say you’ve created a PostgreSQL custom type called <code class=\"docutils literal notranslate\"><span class=\"pre\">mytype</span></code>. You can\nsubclass <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> and implement the <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a> method, like so:</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>Once you have <code class=\"docutils literal notranslate\"><span class=\"pre\">MytypeField</span></code>, you can use it in any model, just like any other\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> type:</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>If you aim to build a database-agnostic application, you should account for\ndifferences in database column types. For example, the date/time column type\nin PostgreSQL is called <code class=\"docutils literal notranslate\"><span class=\"pre\">timestamp</span></code>, while the same column in MySQL is called\n<code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>. The simplest way to handle this in a <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a>\nmethod is to check the <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.settings_dict['ENGINE']</span></code> attribute.</p>\n<p>For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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>The <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a> method is called by Django when the framework\nconstructs the <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code> statements for your application – that is,\nwhen you first create your tables. It is also called when constructing a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> clause that includes the model field – that is, when you retrieve data\nusing QuerySet methods like <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> and have\nthe model field as an argument. It’s not called at any other time, so it can afford to\nexecute slightly complex code, such as the <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.settings_dict</span></code> check in\nthe above example.</p>\n<p>Some database column types accept parameters, such as <code class=\"docutils literal notranslate\"><span class=\"pre\">CHAR(25)</span></code>, where the\nparameter <code class=\"docutils literal notranslate\"><span class=\"pre\">25</span></code> represents the maximum column length. In cases like these,\nit’s more flexible if the parameter is specified in the model rather than being\nhard-coded in the <code class=\"docutils literal notranslate\"><span class=\"pre\">db_type()</span></code> method. For example, it wouldn’t make much\nsense to have a <code class=\"docutils literal notranslate\"><span class=\"pre\">CharMaxlength25Field</span></code>, shown here:</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>The better way of doing this would be to make the parameter specifiable at run\ntime – i.e., when the class is instantiated. To do that, just implement\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Field.__init__()</span></code>, like so:</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=\"n\">BetterCharField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><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>Finally, if your column requires truly complex SQL setup, return <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> from\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a>. This will cause Django’s SQL creation code to skip\nover this field. You are then responsible for creating the column in the right\ntable in some other way, of course, but this gives you a way to tell Django to\nget out of the way.</p>\n</section>\n<section id=\"converting-values-to-python-objects\">\n<span id=\"id2\"></span><h4>Converting values to Python objects<a class=\"heading-anchor\" href=\"#converting-values-to-python-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-changed\" data-version=\"1.8\">\n<p class=\"version-note-title\">Changed in Django 1.8</p><p>Historically, Django provided a metaclass called <code class=\"docutils literal notranslate\"><span class=\"pre\">SubfieldBase</span></code> which\nalways called <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.to_python\" title=\"django.db.models.Field.to_python\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">to_python()</span></code></a> on assignment. This did not play\nnicely with custom database transformations, aggregation, or values\nqueries, so it has been replaced with <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.from_db_value\" title=\"django.db.models.Field.from_db_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code></a>.</p>\n</aside>\n<p>If your custom <a class=\"reference internal\" href=\"/es/1.9/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> class deals with data structures that are more\ncomplex than strings, dates, integers, or floats, then you may need to override\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.from_db_value\" title=\"django.db.models.Field.from_db_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code></a> and <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.to_python\" title=\"django.db.models.Field.to_python\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">to_python()</span></code></a>.</p>\n<p>If present for the field subclass, <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code> will be called in all\ncircumstances when the data is loaded from the database, including in\naggregates and <a class=\"reference internal\" href=\"/es/1.9/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a> calls.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code> is called by deserialization and during the\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/instances/#django.db.models.Model.clean\" title=\"django.db.models.Model.clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">clean()</span></code></a> method used from forms.</p>\n<p>As a general rule, <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code> should deal gracefully with any of the\nfollowing arguments:</p>\n<ul class=\"simple\">\n<li><p>An instance of the correct type (e.g., <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> in our ongoing example).</p></li>\n<li><p>A string</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (if the field allows <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>)</p></li>\n</ul>\n<p>In our <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> class, we’re storing the data as a VARCHAR field in the\ndatabase, so we need to be able to process strings and <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> in the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code>. In <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, we need to also handle <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code>\ninstances:</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\">ugettext_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> <span class=\"n\">context</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>Notice that we always return a <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> instance from these methods. That’s the\nPython object type we want to store in the model’s attribute.</p>\n<p>For <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, if anything goes wrong during value conversion, you should\nraise a <a class=\"reference internal\" href=\"/es/1.9/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> exception.</p>\n</section>\n<section id=\"converting-python-objects-to-query-values\">\n<span id=\"id3\"></span><h4>Converting Python objects to query values<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>Since using a database requires conversion in both ways, if you override\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.to_python\" title=\"django.db.models.Field.to_python\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">to_python()</span></code></a> you also have to override <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_prep_value()</span></code></a>\nto convert Python objects back to query values.</p>\n<p>For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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\">Advertencia</p>\n<p>If your custom field uses the <code class=\"docutils literal notranslate\"><span class=\"pre\">CHAR</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">TEXT</span></code>\ntypes for MySQL, you must make sure that <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_prep_value()</span></code></a>\nalways returns a string type. MySQL performs flexible and unexpected\nmatching when a query is performed on these types and the provided\nvalue is an integer, which can cause queries to include unexpected\nobjects in their results. This problem cannot occur if you always\nreturn a string type from <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><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>Converting query values to database values<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>Some data types (for example, dates) need to be in a specific format\nbefore they can be used by a database backend.\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_db_prep_value\" title=\"django.db.models.Field.get_db_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_db_prep_value()</span></code></a> is the method where those conversions should\nbe made. The specific connection that will be used for the query is\npassed as the <code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></code> parameter. This allows you to use\nbackend-specific conversion logic if it is required.</p>\n<p>For example, Django uses the following method for its\n<a class=\"reference internal\" href=\"/es/1.9/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>:</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=\"n\">BinaryField</span><span class=\"p\">,</span> <span class=\"bp\">self</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>In case your custom field needs a special conversion when being saved that is\nnot the same as the conversion used for normal query parameters, you can\noverride <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_db_prep_save\" title=\"django.db.models.Field.get_db_prep_save\"><code class=\"xref py py-meth docutils literal notranslate\"><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>Preprocessing values before saving<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>If you want to preprocess the value just before saving, you can use\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.pre_save\" title=\"django.db.models.Field.pre_save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">pre_save()</span></code></a>. For example, Django’s\n<a class=\"reference internal\" href=\"/es/1.9/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> uses this method to set the attribute\ncorrectly in the case of <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_now</span></code></a> or\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.DateField.auto_now_add\" title=\"django.db.models.DateField.auto_now_add\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_now_add</span></code></a>.</p>\n<p>If you do override this method, you must return the value of the attribute at\nthe end. You should also update the model’s attribute if you make any changes\nto the value so that code holding references to the model will always see the\ncorrect value.</p>\n</section>\n<section id=\"preparing-values-for-use-in-database-lookups\">\n<span id=\"id6\"></span><h4>Preparing values for use in database lookups<a class=\"heading-anchor\" href=\"#preparing-values-for-use-in-database-lookups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>As with value conversions, preparing a value for database lookups is a\ntwo phase process.</p>\n<p><a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_prep_lookup\" title=\"django.db.models.Field.get_prep_lookup\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_prep_lookup()</span></code></a> performs the first phase of lookup preparation:\ntype conversion and data validation.</p>\n<p>Prepares the <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> for passing to the database when used in a lookup (a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> constraint in SQL). The <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup_type</span></code> parameter will be one of the\nvalid Django filter lookups: <code class=\"docutils literal notranslate\"><span class=\"pre\">exact</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">iexact</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">contains</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">icontains</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">gt</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">gte</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">lt</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">lte</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">in</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">startswith</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">istartswith</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">endswith</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">iendswith</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">range</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">year</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">month</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">day</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">isnull</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">search</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">regex</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">iregex</span></code>.</p>\n<p>If you are using <a class=\"reference internal\" href=\"/es/1.9/howto/custom-lookups/\"><span class=\"doc\">custom lookups</span></a>, the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">lookup_type</span></code> can be any <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup_name</span></code> used by the project’s custom lookups.</p>\n<p>Your method must be prepared to handle all of these <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup_type</span></code> values and\nshould raise either a <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code> if the <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> is of the wrong sort (a\nlist when you were expecting an object, for example) or a <code class=\"docutils literal notranslate\"><span class=\"pre\">TypeError</span></code> if\nyour field does not support that type of lookup. For many fields, you can get\nby with handling the lookup types that need special handling for your field\nand pass the rest to the <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_db_prep_lookup\" title=\"django.db.models.Field.get_db_prep_lookup\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_db_prep_lookup()</span></code></a> method of the parent\nclass.</p>\n<p>If you needed to implement <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_db_prep_save\" title=\"django.db.models.Field.get_db_prep_save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_db_prep_save()</span></code></a>, you will usually need to\nimplement <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_prep_lookup\" title=\"django.db.models.Field.get_prep_lookup\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_prep_lookup()</span></code></a>. If you don’t, <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_prep_value()</span></code></a> will\nbe called by the default implementation, to manage <code class=\"docutils literal notranslate\"><span class=\"pre\">exact</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">gt</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">gte</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">lt</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">lte</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">in</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">range</span></code> lookups.</p>\n<p>You may also want to implement this method to limit the lookup types that could\nbe used with your custom field type.</p>\n<p>Note that, for <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;range&quot;</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;in&quot;</span></code> lookups, <code class=\"docutils literal notranslate\"><span class=\"pre\">get_prep_lookup</span></code> will receive\na list of objects (presumably of the right type) and will need to convert them\nto a list of things of the right type for passing to the database. Most of the\ntime, you can reuse <code class=\"docutils literal notranslate\"><span class=\"pre\">get_prep_value()</span></code>, or at least factor out some common\npieces.</p>\n<p>For example, the following code implements <code class=\"docutils literal notranslate\"><span class=\"pre\">get_prep_lookup</span></code> to limit the\naccepted lookup types to <code class=\"docutils literal notranslate\"><span class=\"pre\">exact</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">in</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">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_lookup</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">lookup_type</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">):</span>\n        <span class=\"c1\"># We only handle &#39;exact&#39; and &#39;in&#39;. All others are errors.</span>\n        <span class=\"k\">if</span> <span class=\"n\">lookup_type</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;exact&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_prep_value</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n        <span class=\"k\">elif</span> <span class=\"n\">lookup_type</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;in&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_prep_value</span><span class=\"p\">(</span><span class=\"n\">v</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">value</span><span class=\"p\">]</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s1\">&#39;Lookup type </span><span class=\"si\">%r</span><span class=\"s1\"> not supported.&#39;</span> <span class=\"o\">%</span> <span class=\"n\">lookup_type</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>For performing database-specific data conversions required by a lookup,\nyou can override <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_db_prep_lookup\" title=\"django.db.models.Field.get_db_prep_lookup\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_db_prep_lookup()</span></code></a>.</p>\n</section>\n<section id=\"specifying-the-form-field-for-a-model-field\">\n<span id=\"specifying-form-field-for-model-field\"></span><h4>Specifying the form field for a model field<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>To customize the form field used by <a class=\"reference internal\" href=\"/es/1.9/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>, you can\noverride <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.formfield\" title=\"django.db.models.Field.formfield\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">formfield()</span></code></a>.</p>\n<p>The form field class can be specified via the <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">choices_form_class</span></code> arguments; the latter is used if the field has choices\nspecified, the former otherwise. If these arguments are not provided,\n<a class=\"reference internal\" href=\"/es/1.9/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> or <a class=\"reference internal\" href=\"/es/1.9/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>\nwill be used.</p>\n<p>All of the <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> dictionary is passed directly to the form field’s\n<code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> method. Normally, all you need to do is set up a good default\nfor the <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> (and maybe <code class=\"docutils literal notranslate\"><span class=\"pre\">choices_form_class</span></code>) argument and then\ndelegate further handling to the parent class. This might require you to write\na custom form field (and even a form widget). See the <a class=\"reference internal\" href=\"/es/1.9/topics/forms/\"><span class=\"doc\">forms documentation</span></a> for information about this.</p>\n<p>Continuing our ongoing example, we can write the <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.formfield\" title=\"django.db.models.Field.formfield\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">formfield()</span></code></a> method\nas:</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=\"n\">HandField</span><span class=\"p\">,</span> <span class=\"bp\">self</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>This assumes we’ve imported a <code class=\"docutils literal notranslate\"><span class=\"pre\">MyFormField</span></code> field class (which has its own\ndefault widget). This document doesn’t cover the details of writing custom form\nfields.</p>\n</section>\n<section id=\"emulating-built-in-field-types\">\n<span id=\"id7\"></span><h4>Emulating built-in field types<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>If you have created a <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a> method, you don’t need to worry about\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_internal_type\" title=\"django.db.models.Field.get_internal_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_internal_type()</span></code></a> – it won’t be used much. Sometimes, though, your\ndatabase storage is similar in type to some other field, so you can use that\nother field’s logic to create the right column.</p>\n<p>For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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>No matter which database backend we are using, this will mean that\n<a class=\"reference internal\" href=\"/es/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> and other SQL commands create the right column type for\nstoring a string.</p>\n<p>If <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.get_internal_type\" title=\"django.db.models.Field.get_internal_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_internal_type()</span></code></a> returns a string that is not known to Django for\nthe database backend you are using – that is, it doesn’t appear in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends.&lt;db_name&gt;.base.DatabaseWrapper.data_types</span></code> – the string\nwill still be used by the serializer, but the default <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a>\nmethod will return <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. See the documentation of <a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a>\nfor reasons why this might be useful. Putting a descriptive string in as the\ntype of the field for the serializer is a useful idea if you’re ever going to\nbe using the serializer output in some other place, outside of Django.</p>\n</section>\n<section id=\"converting-field-data-for-serialization\">\n<span id=\"converting-model-field-to-serialization\"></span><h4>Converting field data for serialization<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>To customize how the values are serialized by a serializer, you can override\n<a class=\"reference internal\" href=\"/es/1.9/ref/models/fields/#django.db.models.Field.value_to_string\" title=\"django.db.models.Field.value_to_string\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">value_to_string()</span></code></a>. Using <code class=\"docutils literal notranslate\"><span class=\"pre\">value_from_object()</span></code> is the best way\nto get the field’s value prior to serialization. For example, since our\n<code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> uses strings for its data storage anyway, we can reuse some\nexisting conversion code:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">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>Some general advice<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>Writing a custom field can be a tricky process, particularly if you’re doing\ncomplex conversions between your Python types and your database and\nserialization formats. Here are a couple of tips to make things go more\nsmoothly:</p>\n<ol class=\"arabic simple\">\n<li><p>Look at the existing Django fields (in\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">django/db/models/fields/__init__.py</span></code>) for inspiration. Try to find\na field that’s similar to what you want and extend it a little bit,\ninstead of creating an entirely new field from scratch.</p></li>\n<li><p>Put a <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> (<code class=\"docutils literal notranslate\"><span class=\"pre\">__unicode__()</span></code> on Python 2) method on the class you’re\nwrapping up as a field. There are a lot of places where the default\nbehavior of the field code is to call\n<a class=\"reference internal\" href=\"/es/1.9/ref/utils/#django.utils.encoding.force_text\" title=\"django.utils.encoding.force_text\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">force_text()</span></code></a> on the value. (In our\nexamples in this document, <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> would be a <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> instance, not a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>). So if your <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> method (<code class=\"docutils literal notranslate\"><span class=\"pre\">__unicode__()</span></code> on\nPython 2) automatically converts to the string form of your Python object,\nyou can save yourself a lot of work.</p></li>\n</ol>\n</section>\n</section>\n<section id=\"writing-a-filefield-subclass\">\n<h2>Writing a <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> subclass<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>In addition to the above methods, fields that deal with files have a few other\nspecial requirements which must be taken into account. The majority of the\nmechanics provided by <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code>, such as controlling database storage and\nretrieval, can remain unchanged, leaving subclasses to deal with the challenge\nof supporting a particular type of file.</p>\n<p>Django provides a <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> class, which is used as a proxy to the file’s\ncontents and operations. This can be subclassed to customize how the file is\naccessed, and what methods are available. It lives at\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.fields.files</span></code>, and its default behavior is explained in the\n<a class=\"reference internal\" href=\"/es/1.9/ref/files/file/\"><span class=\"doc\">file documentation</span></a>.</p>\n<p>Once a subclass of <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> is created, the new <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> subclass must be\ntold to use it. To do so, simply assign the new <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> subclass to the special\n<code class=\"docutils literal notranslate\"><span class=\"pre\">attr_class</span></code> attribute of the <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> subclass.</p>\n<section id=\"a-few-suggestions\">\n<h3>A few suggestions<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>In addition to the above details, there are a few guidelines which can greatly\nimprove the efficiency and readability of the field’s code.</p>\n<ol class=\"arabic simple\">\n<li><p>The source for Django’s own <code class=\"docutils literal notranslate\"><span class=\"pre\">ImageField</span></code> (in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django/db/models/fields/files.py</span></code>) is a great example of how to\nsubclass <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> to support a particular type of file, as it\nincorporates all of the techniques described above.</p></li>\n<li><p>Cache file attributes wherever possible. Since files may be stored in\nremote storage systems, retrieving them may cost extra time, or even\nmoney, that isn’t always necessary. Once a file is retrieved to obtain\nsome data about its content, cache as much of that data as possible to\nreduce the number of times the file must be retrieved on subsequent\ncalls for that information.</p></li>\n</ol>\n</section>\n</section>","rootId":"writing-custom-model-fields","toc":[{"title":"Introduction","anchor":"introduction","children":[{"title":"Our example object","anchor":"our-example-object","children":[]}]},{"title":"Background theory","anchor":"background-theory","children":[{"title":"Database storage","anchor":"database-storage","children":[]},{"title":"What does a field class do?","anchor":"what-does-a-field-class-do","children":[]}]},{"title":"Writing a field subclass","anchor":"writing-a-field-subclass","children":[{"title":"Field deconstruction","anchor":"field-deconstruction","children":[]},{"title":"Changing a custom field’s base class","anchor":"changing-a-custom-field-s-base-class","children":[]},{"title":"Documenting your custom field","anchor":"documenting-your-custom-field","children":[]},{"title":"Useful methods","anchor":"useful-methods","children":[{"title":"Custom database types","anchor":"custom-database-types","children":[]},{"title":"Converting values to Python objects","anchor":"converting-values-to-python-objects","children":[]},{"title":"Converting Python objects to query values","anchor":"converting-python-objects-to-query-values","children":[]},{"title":"Converting query values to database values","anchor":"converting-query-values-to-database-values","children":[]},{"title":"Preprocessing values before saving","anchor":"preprocessing-values-before-saving","children":[]},{"title":"Preparing values for use in database lookups","anchor":"preparing-values-for-use-in-database-lookups","children":[]},{"title":"Specifying the form field for a model field","anchor":"specifying-the-form-field-for-a-model-field","children":[]},{"title":"Emulating built-in field types","anchor":"emulating-built-in-field-types","children":[]},{"title":"Converting field data for serialization","anchor":"converting-field-data-for-serialization","children":[]}]},{"title":"Some general advice","anchor":"some-general-advice","children":[]}]},{"title":"Writing a FileField subclass","anchor":"writing-a-filefield-subclass","children":[{"title":"A few suggestions","anchor":"a-few-suggestions","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"«How-to» guides","url":"/es/1.9/howto/"}],"prev":{"docname":"howto/custom-management-commands","title":"Writing custom django-admin commands","url":"/es/1.9/howto/custom-management-commands/"},"next":{"docname":"howto/custom-lookups","title":"Custom Lookups","url":"/es/1.9/howto/custom-lookups/"},"formats":{"html":"/es/1.9/howto/custom-model-fields/","markdown":"/es/1.9/howto/custom-model-fields.md","json":"/es/1.9/howto/custom-model-fields.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/howto/custom-model-fields.txt","official":"https://docs.djangoproject.com/es/1.9/howto/custom-model-fields/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","es"]}