{"title":"Escribiendo campos del modelo personalizado","version":"3.1","locale":"es","docname":"howto/custom-model-fields","url":"/es/3.1/howto/custom-model-fields/","canonical":"https://djangodocs.dev/es/3.1/howto/custom-model-fields/","summary":"Introducción Link to this heading # The model reference documentation explains how to use Django’s standard field classes – CharField , DateField , etc. For many…","html":"<h1>Escribiendo campos del modelo personalizado<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>Introducción<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/3.1/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/3.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a>,\n<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></code></a>, 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=\"https://www.postgresql.org/docs/current/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>\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 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>Fundamentos teóricos<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>Let’s start with model fields. If you break it down, a model field provides a\nway to take a normal Python object – string, boolean, <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>, or\nsomething more complex like <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> – and convert it to and from a format\nthat is useful when dealing with the database. (Such a format is also useful\nfor serialization, but as we’ll see later, that is easier once you have the\ndatabase 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 you will need a way to convert your data to, say, 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>¿Qué hace una clase field?<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/3.1/ref/forms/fields/\"><span class=\"doc\">form fields</span></a>) are subclasses\nof <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.Field</span></code></a>. 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/3.1/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/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> subclass, first give some\nthought to which existing <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> 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/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a>\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/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> (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/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> 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/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> subclass.) It doesn’t\nbehave like any existing field, so we’ll subclass directly from\n<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n\n    <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;A hand of cards (bridge style)&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;max_length&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">104</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>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/3.1/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> and\n<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_now</span></code></a> to a\n<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.DateField</span></code></a> and it will ignore the\n<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> parameter\n(<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_now</span></code></a> 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 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 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/3.1/ref/models/fields/#django.db.models.Field.verbose_name\" title=\"django.db.models.Field.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">primary_key</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.CharField.max_length\" title=\"django.db.models.CharField.max_length\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">max_length</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.blank\" title=\"django.db.models.Field.blank\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">blank</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">null</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.db_index\" title=\"django.db.models.Field.db_index\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_index</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">rel</span></code>: Used for related fields (like <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>). For advanced\nuse only.</p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/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/3.1/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">serialize</span></code>: 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/3.1/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/3.1/ref/models/fields/#django.db.models.Field.unique_for_date\" title=\"django.db.models.Field.unique_for_date\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_for_date</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.unique_for_month\" title=\"django.db.models.Field.unique_for_month\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_for_month</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.unique_for_year\" title=\"django.db.models.Field.unique_for_year\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_for_year</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.choices\" title=\"django.db.models.Field.choices\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">choices</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.help_text\" title=\"django.db.models.Field.help_text\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">help_text</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.db_column\" title=\"django.db.models.Field.db_column\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_column</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.db_tablespace\" title=\"django.db.models.Field.db_tablespace\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_tablespace</span></code></a>: Only for index creation, if the\nbackend supports <a class=\"reference internal\" href=\"/es/3.1/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/3.1/ref/models/fields/#django.db.models.Field.auto_created\" title=\"django.db.models.Field.auto_created\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_created</span></code></a>: <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if the field was\nautomatically created, as for the <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a>\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/3.1/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<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.deconstruct\" title=\"django.db.models.Field.deconstruct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code></a> method. It’s used during <a class=\"reference internal\" href=\"/es/3.1/topics/migrations/\"><span class=\"doc\">model migrations</span></a> to tell Django how to take an instance of your new field\nand reduce it to a serialized form - in particular, what arguments to pass to\n<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><code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> returns a tuple of four items: the field’s attribute name,\nthe full import path of the field class, the positional arguments (as a list),\nand the keyword arguments (as a dict). Note this is different from the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> method <a class=\"reference internal\" href=\"/es/3.1/topics/migrations/#custom-deconstruct-method\"><span class=\"std std-ref\">for custom classes</span></a>\nwhich 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=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">deconstruct</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">deconstruct</span><span class=\"p\">()</span>\n        <span class=\"k\">del</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;max_length&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span>\n</code></pre></div>\n<p>If you add a new keyword argument, you need to write code in <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code>\nthat puts its value into <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> yourself. You should also omit the value\nfrom <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> when it isn’t necessary to reconstruct the state of the field,\nsuch as when the default value is being used:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CommaSepField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"s2\">&quot;Implements comma-separated storage of lists&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">separator</span><span class=\"o\">=</span><span class=\"s2\">&quot;,&quot;</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">separator</span> <span class=\"o\">=</span> <span class=\"n\">separator</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">deconstruct</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">deconstruct</span><span class=\"p\">()</span>\n        <span class=\"c1\"># Only include kwarg if it&#39;s not the default</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">separator</span> <span class=\"o\">!=</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"p\">:</span>\n            <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;separator&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">separator</span>\n        <span class=\"k\">return</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span>\n</code></pre></div>\n<p>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.\nIf you change the names of things more often than their position in the\nconstructor’s argument list, you might prefer positional, but bear in mind that\npeople will be reconstructing your field from the serialized version for quite\na 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 deconstructing and\nreconstructing 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/3.1/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/3.1/ref/contrib/admin/admindocs/\"><span class=\"doc\">django.contrib.admindocs</span></a> application. To do this provide descriptive\ntext in a <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.description\" title=\"django.db.models.Field.description\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">description</span></code></a> class attribute of your custom field. In\nthe above example, the description displayed by the <code class=\"docutils literal notranslate\"><span class=\"pre\">admindocs</span></code> application\nfor 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/3.1/ref/contrib/admin/admindocs/#module-django.contrib.admindocs\" title=\"django.contrib.admindocs: Django's admin documentation generator.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.admindocs</span></code></a> 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/3.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> 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/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> 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/3.1/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a> 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>. You can handle this in a <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a> method by\nchecking the <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.settings_dict['ENGINE']</span></code> attribute.</p>\n<p>Por ejemplo:</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/3.1/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a> and <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.rel_db_type\" title=\"django.db.models.Field.rel_db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">rel_db_type()</span></code></a> methods are called by\nDjango when the framework constructs the <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code> statements for your\napplication – that is, when you first create your tables. The methods are also\ncalled when constructing a <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> clause that includes the model field –\nthat is, when you retrieve data using QuerySet methods like <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>,\n<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 the model field as an argument. They\nare not called at any other time, so it can afford to execute slightly complex\ncode, such as the <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.settings_dict</span></code> check in the 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, 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=\"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/3.1/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a>. 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, but this gives you a way to tell Django to get out of\nthe way.</p>\n<p>The <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.rel_db_type\" title=\"django.db.models.Field.rel_db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">rel_db_type()</span></code></a> method is called by fields such as <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code>\nand <code class=\"docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code> that point to another field to determine their database\ncolumn data types. For example, if you have an <code class=\"docutils literal notranslate\"><span class=\"pre\">UnsignedAutoField</span></code>, you also\nneed the foreign keys that point to that field to use the same data 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=\"c1\"># MySQL unsigned integer (range 0 to 4294967295).</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">UnsignedAutoField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">AutoField</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;integer UNSIGNED AUTO_INCREMENT&#39;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">rel_db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;integer UNSIGNED&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"converting-values-to-python-objects\">\n<span id=\"id2\"></span><h4>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<p>If your custom <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> 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/3.1/ref/models/fields/#django.db.models.Field.from_db_value\" title=\"django.db.models.Field.from_db_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code></a> and <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.to_python\" title=\"django.db.models.Field.to_python\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">to_python()</span></code></a>.</p>\n<p>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/3.1/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a> 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/3.1/ref/models/instances/#django.db.models.Model.clean\" title=\"django.db.models.Model.clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">clean()</span></code></a> 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\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">hand_string</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;Takes a string of cards and splits into a full hand.&quot;&quot;&quot;</span>\n    <span class=\"n\">p1</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s1\">&#39;.</span><span class=\"si\">{26}</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">p2</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s1\">&#39;..&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">p2</span><span class=\"o\">.</span><span class=\"n\">findall</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">p1</span><span class=\"o\">.</span><span class=\"n\">findall</span><span class=\"p\">(</span><span class=\"n\">hand_string</span><span class=\"p\">)]</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"mi\">4</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Invalid input for a Hand instance&quot;</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">Hand</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">from_db_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">expression</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n        <span class=\"k\">return</span> <span class=\"n\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">to_python</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">Hand</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n\n        <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n\n        <span class=\"k\">return</span> <span class=\"n\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>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/3.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a> 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/3.1/ref/models/fields/#django.db.models.Field.from_db_value\" title=\"django.db.models.Field.from_db_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code></a> you also have to override\n<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_prep_value()</span></code></a> to convert Python objects back to query values.</p>\n<p>Por ejemplo:</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/3.1/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_prep_value()</span></code></a>\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/3.1/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_prep_value()</span></code></a>.</p>\n</aside>\n</section>\n<section id=\"converting-query-values-to-database-values\">\n<span id=\"id4\"></span><h4>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/3.1/ref/models/fields/#django.db.models.Field.get_db_prep_value\" title=\"django.db.models.Field.get_db_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_db_prep_value()</span></code></a> 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/3.1/ref/models/fields/#django.db.models.BinaryField\" title=\"django.db.models.BinaryField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BinaryField</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_db_prep_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">,</span> <span class=\"n\">prepared</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n    <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_db_prep_value</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">,</span> <span class=\"n\">prepared</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">Database</span><span class=\"o\">.</span><span class=\"n\">Binary</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">value</span>\n</code></pre></div>\n<p>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/3.1/ref/models/fields/#django.db.models.Field.get_db_prep_save\" title=\"django.db.models.Field.get_db_prep_save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_db_prep_save()</span></code></a>.</p>\n</section>\n<section id=\"preprocessing-values-before-saving\">\n<span id=\"id5\"></span><h4>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/3.1/ref/models/fields/#django.db.models.Field.pre_save\" title=\"django.db.models.Field.pre_save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">pre_save()</span></code></a>. For example, Django’s\n<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a> uses this method to set the attribute\ncorrectly in the case of <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_now</span></code></a> or\n<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.DateField.auto_now_add\" title=\"django.db.models.DateField.auto_now_add\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_now_add</span></code></a>.</p>\n<p>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=\"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/3.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code></a>, you can\noverride <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.formfield\" title=\"django.db.models.Field.formfield\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">formfield()</span></code></a>.</p>\n<p>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/3.1/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> or <a class=\"reference internal\" href=\"/es/3.1/ref/forms/fields/#django.forms.TypedChoiceField\" title=\"django.forms.TypedChoiceField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TypedChoiceField</span></code></a>\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/3.1/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/3.1/ref/models/fields/#django.db.models.Field.formfield\" title=\"django.db.models.Field.formfield\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">formfield()</span></code></a> 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=\"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=\"id6\"></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/3.1/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a> method, you don’t need to worry about\n<a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.get_internal_type\" title=\"django.db.models.Field.get_internal_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_internal_type()</span></code></a> – 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>Por ejemplo:</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/3.1/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/3.1/ref/models/fields/#django.db.models.Field.get_internal_type\" title=\"django.db.models.Field.get_internal_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_internal_type()</span></code></a> 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/3.1/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a>\nmethod will return <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. See the documentation of <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a>\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/3.1/ref/models/fields/#django.db.models.Field.value_to_string\" title=\"django.db.models.Field.value_to_string\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">value_to_string()</span></code></a>. Using <a class=\"reference internal\" href=\"/es/3.1/ref/models/fields/#django.db.models.Field.value_from_object\" title=\"django.db.models.Field.value_from_object\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">value_from_object()</span></code></a> is the\nbest way to get the field’s value prior to serialization. For example, since\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> method on the class you’re wrapping up as a field. There\nare a lot of places where the default behavior of the field code is to call\n<code class=\"docutils literal notranslate\"><span class=\"pre\">str()</span></code> on the value. (In our examples in this document, <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> would\nbe a <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> instance, not a <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>\nmethod automatically converts to the string form of your Python object, you\ncan 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/3.1/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, 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":"Introducción","anchor":"introduction","children":[{"title":"Our example object","anchor":"our-example-object","children":[]}]},{"title":"Fundamentos teóricos","anchor":"background-theory","children":[{"title":"Database storage","anchor":"database-storage","children":[]},{"title":"¿Qué hace una clase field?","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":"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/3.1/howto/"}],"prev":{"docname":"howto/custom-management-commands","title":"Writing custom django-admin commands","url":"/es/3.1/howto/custom-management-commands/"},"next":{"docname":"howto/custom-lookups","title":"Búsquedas personalizadas","url":"/es/3.1/howto/custom-lookups/"},"formats":{"html":"/es/3.1/howto/custom-model-fields/","markdown":"/es/3.1/howto/custom-model-fields.md","json":"/es/3.1/howto/custom-model-fields.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/howto/custom-model-fields.txt","official":"https://docs.djangoproject.com/es/3.1/howto/custom-model-fields/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}