{"title":"Como criar campos de modelo customizado","version":"6.1","locale":"pt-br","docname":"howto/custom-model-fields","url":"/pt-br/6.1/howto/custom-model-fields/","canonical":"https://djangodocs.dev/pt-br/6.1/howto/custom-model-fields/","summary":"Introdução Link para este cabeçalho # A documentação referência de modelo explica como usar as classes de campo padrão do Django – CharField , DateField , etc. Para…","html":"<h1>Como criar campos de modelo customizado<a class=\"heading-anchor\" href=\"#how-to-create-custom-model-fields\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"introduction\">\n<h2>Introdução<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>A documentação <a class=\"reference internal\" href=\"/pt-br/6.1/topics/db/models/\"><span class=\"doc\">referência de modelo</span></a> explica como usar as classes de campo padrão do Django –<a class=\"reference internal\" href=\"/pt-br/6.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a>, <a class=\"reference internal\" href=\"/pt-br/6.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. Para muitos propósitos, essas classes são tudo o que você irá precisar. Às vezes, porém, a versão do Django não irá atender às suas necessidades específicas, ou você irá querer usar um campo que é totalmente diferente daqueles fornecidos com Django.</p>\n<p>Os tipos de campos embutidos no Django não cobrem todas os possíveis tipos de colunas do banco de dados – somente os tipos comuns, tais como <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR``e</span> <span class=\"pre\">``INTEGER</span></code>. Para tipos de colunas mais obscuros, tal como polígonos geográficos ou ainda tipos criados pelo usuário como <a href=\"#id7\"><span class=\"problematic\" id=\"id8\">`PostgreSQL custom Types`__</span></a>, é possível definir sua própria subclasse de <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> do Django.</p>\n<p>Por outro lado, pode haver um tipo complexo de objeto no Python que pode de alguma maneira ser serializado para que se encaixe em um tipo de coluna padrão no banco de dados. Este é um outro caso onde uma subclasse de <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> pode ajudar a utilizar o objeto com o “models”.</p>\n<section id=\"our-example-object\">\n<h3>Nosso objeto de exemplo<a class=\"heading-anchor\" href=\"#our-example-object\"><span class=\"visually-hidden\">Link para este cabeçalho</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>Isto é uma classe Python ordinária, com nada específico voltado ao Django. Nós gostamos de poder fazer coisas como essa em nossos modelos ( assumimos que o atributo <code class=\"docutils literal notranslate\"><span class=\"pre\">hand</span></code> no modelo é um instância de <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>Atribuimos ou lemos o valor do atributo <code class=\"docutils literal notranslate\"><span class=\"pre\">hand</span></code> no nosso modelo como em qualquer outra classe Python. Este truque é para dizer ao Django como manipular a gravação e a leitura como um objeto.</p>\n<p>Para utilizar a classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> em nossos modelos, nós <strong>não</strong> precisamos alterar essa classe em nada. Isso é ideal, porque quer dizer que podemos facilmente escrever modelos de suporte para classes existentes cujo o código fonte não pode ser alterado.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Você pode estar querendo tirar vantagem dos tipos customizados de colunas de banco de dados e lidar com o dado como um tipo de dado Python padrão nos seus modelos; Este caso é similar ao nosso exemplo <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code>  e iremos explicitar qualquer diferença enquanto continuamos.</p>\n</aside>\n</section>\n</section>\n<section id=\"background-theory\">\n<h2>A teoria por trás.<a class=\"heading-anchor\" href=\"#background-theory\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"database-storage\">\n<h3>Armazenamento no Banco de Dados.<a class=\"heading-anchor\" href=\"#database-storage\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Vamos começar com campos de modelo. Se você decompô-lo, um campo de modelo fornece uma maneira de pegar um objeto Python normal – string, boolean, <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> ou algo mais complexo como <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> – e convertê-lo de e para um formato que é útil quando se lida com o banco de dados. (Esse formato também é útil para serialização, mas como veremos mais adiante, isso é mais fácil quando você tem o lado do banco de dados sob controle).</p>\n<p>Campos em um modelo devem ser de alguma maneira convertidos para que se encaixem em um tipo de coluna de banco de dados já existente. Bancos de dados diferentes provêem diferentes tipos de colunas, mas a regra ainda é a mesma: aqueles são os únicos dados que se tem para trabalhar. Qualquer coisa que se queira guardar em um banco de dados deve se encaixar em um daqueles tipos.</p>\n<p>Normalmente, você está escrevendo um campo Django para corresponder a um determinado tipo de coluna de banco de dados ou precisará de uma maneira de converter seus dados em, digamos, uma string.</p>\n<p>Para nosso exemplo de <code class=\"docutils literal notranslate\"><span class=\"pre\">Mão</span></code>, poderíamos converter os dados do cartão em uma string de 104 caracteres concatenando todos os cartões juntos em uma ordem predeterminada – digamos, todos os cartões do <em>norte</em> primeiro, depois o <em>leste</em>, * sul* e <em>oeste</em>. Assim, os objetos <code class=\"docutils literal notranslate\"><span class=\"pre\">Mão</span></code> podem ser salvos em colunas de texto ou caracteres no banco de dados.</p>\n</section>\n<section id=\"what-does-a-field-class-do\">\n<h3>O que uma classe campo faz?<a class=\"heading-anchor\" href=\"#what-does-a-field-class-do\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Todos os campos do Django (e quando dizemos <em>campo</em> neste documento, sempre queremos dizer campos do modelo e não <a class=\"reference internal\" href=\"/pt-br/6.1/ref/forms/fields/\"><span class=\"doc\">campos de forms</span></a>) são subclasses de <a class=\"reference internal\" href=\"/pt-br/6.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>. A maioria das informações que o Django registra sobre um campo é comum a todos os campos –name, help text, uniqueness e por diante. Armazenar toda essa informação é papel de <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>. Iremos entrar em detalhes precisos do que o <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> pode fazer mais tarde; por agora, basta dizer que tudo descende de <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> e então customizamos partes chaves do comportamento da classe.</p>\n<p>É importante dizer que a classe de campo do Django não é o que é armazenado no seus atributos do modelo. Os atributos dos modelos contém objetos Python normais. As classes de campo que são definidas em um modelo são na verdade armazenadas dentro da classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> quando a classe é criada (os detalhes precisos de como isso é feito são importantes aqui). Isso é porque as classes de campos não são necessárias enquanto se está modificando atributos. Na verdade, eles fornecem o maquinário para conversão entre o valor do atributo e o que é armazenado no banco de dados ou enviado para o <a class=\"reference internal\" href=\"/pt-br/6.1/topics/serialization/\"><span class=\"doc\">serializador</span></a>.</p>\n<p>Tenha isso em mente ao criar seus próprios campos. A subclasse <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> do Django que você escreve provê o maquinário para conversão entre suas instancias Python e os valores do banco de dados/serializador de várias maneiras (existe uma diferença entre armazenar um valor e usar um valor para lookups por exemplo). Se isso lhe soa um pouco confuso, não se preocupe – se tornará claro no exemplo abaixo. Mas lembre que muitas vezes acabará por criar duas classes quando quiser um campo personalizado:</p>\n<ul class=\"simple\">\n<li><p>A primeira classe é o objeto Python que os usuários irão manipular. Irão assinalar isso a um atributo de model, lerão para mostrar, coisas assim. Esta é a classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> em nosso exemplo.</p></li>\n<li><p>A segunda classe é a subclasse <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>. Essa é a classe que sabe como converter sua classe entre sua forma de armazenamento permanente e a forma do Python e vice-versa.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"writing-a-field-subclass\">\n<h2>Escrevendo uma subclasse de campo<a class=\"heading-anchor\" href=\"#writing-a-field-subclass\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Quando estiver panejando sua subclasse de <a class=\"reference internal\" href=\"/pt-br/6.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>, primeiro de uma com qual classe já existente <a class=\"reference internal\" href=\"/pt-br/6.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> seu campo se parece mais. É possível fazer uma subclasse de campo Django já existente  e economizar algum trabalho ? Caso não, você deve construir uma subclasse de <a class=\"reference internal\" href=\"/pt-br/6.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>, da qual tudo descende.</p>\n<p>Iniciar seu novo campo é uma questão de separar quaisquer argumentos que são específicos para seu caso dos argumentos comuns e passar este último para o método <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> da <a class=\"reference internal\" href=\"/pt-br/6.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> (ou sua classe pai).</p>\n<p>No nosso exemplo, iremos chamar nosso campo de <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>. (é uma boa idéia chamar sua subclasse <a class=\"reference internal\" href=\"/pt-br/6.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>  <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;AgumaCoisa&gt;Field</span></code>, então ela fica facilmente identificável como uma subclasse de  <a class=\"reference internal\" href=\"/pt-br/6.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>) . Nosso campo não se comporta como nenhum outro campo existente, então iremos herdar diretamente de  <a class=\"reference internal\" href=\"/pt-br/6.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\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=\"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=\"s2\">&quot;max_length&quot;</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>Nosso <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> aceita a maioria das opções dos campos padrão (veja a lista abaixo), mas asseguramos que ele tenha um comprimento fixo, já que só precisa de 52 valores de carta mais seus naipes; 104 caracteres no total.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Muitos dos campos de modelo do Django aceitam opções com as quais não fazem nada. Por exemplo, você pode passar <a class=\"reference internal\" href=\"/pt-br/6.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> e <a class=\"reference internal\" href=\"/pt-br/6.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> para um <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.</span> <span class=\"pre\">DateField</span></code> e irá ignorar o parâmetro <a class=\"reference internal\" href=\"/pt-br/6.1/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> (<a class=\"reference internal\" href=\"/pt-br/6.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> sendo definido implica <code class=\"docutils literal notranslate\"><span class=\"pre\">editable=False</span></code>) . Nenhum erro é levantado neste caso.</p>\n<p>Esse comportamento simplifica as classes de campo, pois não precisam verificar opções desnecessárias. Eles passam todas as opções para a classe pai e não as usam mais tarde. Cabe a você decidir se deseja que seus campos sejam mais rígidos sobre as opções selecionadas ou se deseja usar o comportamento mais permissivo dos campos atuais.</p>\n</aside>\n<p>O método <code class=\"docutils literal notranslate\"><span class=\"pre\">Field.__init__()</span></code> recebe os seguintes parâmetros:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/pt-br/6.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=\"/pt-br/6.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=\"/pt-br/6.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=\"/pt-br/6.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=\"/pt-br/6.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=\"/pt-br/6.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=\"/pt-br/6.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>: Usado para campos relacionados (como <a class=\"reference internal\" href=\"/pt-br/6.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>). Somente para uso avançado.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/6.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=\"/pt-br/6.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>: se <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, o campo não será “serializado” quando o modelo for passado para os  <a class=\"reference internal\" href=\"/pt-br/6.1/topics/serialization/\"><span class=\"doc\">serializadores</span></a>. Padrão é <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/6.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=\"/pt-br/6.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=\"/pt-br/6.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=\"/pt-br/6.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=\"/pt-br/6.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=\"/pt-br/6.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=\"/pt-br/6.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>: Somente para a criação de índice, se o “backend” suportar <a class=\"reference internal\" href=\"/pt-br/6.1/topics/db/tablespaces/\"><span class=\"doc\">tablespaces</span></a>. Normalmente é possível ignorar essa opção.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/6.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> se o campo foi criado automaticamente, como para o <a class=\"reference internal\" href=\"/pt-br/6.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> usado pela herança de modelo. Somente para uso avançado.</p></li>\n</ul>\n<p>Todas as opções sem uma explicação na lista acima tem o mesmo significado que os campos normais do Django. veja a <a class=\"reference internal\" href=\"/pt-br/6.1/ref/models/fields/\"><span class=\"doc\">field documentation</span></a> para exemplos e detalhes.</p>\n<section id=\"field-deconstruction\">\n<span id=\"custom-field-deconstruct-method\"></span><h3>A descontrução do Campo<a class=\"heading-anchor\" href=\"#field-deconstruction\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O contraponto para escrever seu método <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> é escrever o método <a class=\"reference internal\" href=\"/pt-br/6.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>. É usado durante <span class=\"xref std std-doc\">model migrations ` para dizer ao Django como pegar uma instância de seu novo campo e reduzi-lo a um formato serializado - em particular, quais argumentos passar para ``__init__()`</span> para recriá-lo.</p>\n<p>Se não foram adicionadas opções extras ao campo que foi herdado, então não há necessidade de reescrever o método <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code>. Por outro lado,  se você mudar os argumentos passados no <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> (como em <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>), será preciso complementar os argumentos sendo passados.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> retorna uma tupla de quatro itens: o nome do atributo do campo, o caminho de importação completo da classe do campo, os argumentos posicionais (como uma lista) e os argumentos da palavra-chave (como um dict). Note que isso é diferente do método <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>para classes customizadas ` que retorna uma tupla de três coisas.</p>\n<p>Como autor do campo customizado, não é necessário se preocupar sobre os dois primeiros valores; a classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> básica tem todo o código para o atributo “name” e “import path” funcionar. Entretanto, devemos nos preocupar com o argumentos posicionais e os nomeados, já que estes são as alterações que fizemos</p>\n<p>Por exemplo, na nossa classe “HandField” sempre somos forçados a definir max_length em “ __init __ () “. O método “deconstruct()”  da classe base “Field” ierá tentar retornar os argumentos da palavra-chave; assim, podemos lançar a partir dos argumentos palavras-chaves para facilitar a leitura</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\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=\"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=\"s2\">&quot;max_length&quot;</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>Se você adicionar um novo argumento chave, você vai precisar escrever código em <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> que põe o valor dentro de <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> você mesmo. Você deveria também omitir o valor de <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> quando ele não é necessário para reconstruir o estado do campo, como quando se usa o valor padrão:</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\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=\"s2\">&quot;separator&quot;</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>Exemplos mais complexos estão além do escopo deste documento, mas lembre - para qualquer configuração da sua instância de Field, o <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> tem que retornar argumentos que se possa passar para o <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> para reconstruir aquele estado.</p>\n<p>Preste atenção extra se foram definidos novos valores padrão para argumentos na superclasse do <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>, tem que ter certeza de que estes são sempre incluídos, ao invés de desaparecer se recebem o valor antigo.</p>\n<p>Além disso, evite retornar valores como argumentos posicionais; sempre que possível, retorne valores como argumentos de palavra-chave para máxima compatibilidade futura. Se você alterar os nomes das coisas com mais frequência do que sua posição na lista de argumentos do construtor, talvez prefira posicional, mas tenha em mente que as pessoas estarão reconstruindo seu campo a partir da versão serializada por um bom tempo (possivelmente anos), dependendo de quanto tempo suas migrações vivem.</p>\n<p>Você pode ver os resultados da desconstrução observando as migrações que incluem o campo e pode testar a desconstrução em testes de unidade desconstruindo e reconstruindo o campo:</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=\"field-attributes-not-affecting-database-column-definition\">\n<span id=\"custom-field-non-db-attrs\"></span><h3>Atributos de campo que não afetam a definição da coluna do banco de dados<a class=\"heading-anchor\" href=\"#field-attributes-not-affecting-database-column-definition\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Você pode substituir <code class=\"docutils literal notranslate\"><span class=\"pre\">Field.non_db_attrs</span></code> para personalizar os atributos de um campo que não afetam a definição de uma coluna. É usado durante as migrações do modelo para detectar operações <code class=\"docutils literal notranslate\"><span class=\"pre\">AlterField</span></code> no-op.</p>\n<p>Por exemplo:</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\">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=\"nd\">@property</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">non_db_attrs</span><span class=\"p\">(</span><span class=\"bp\">self</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\">non_db_attrs</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"s2\">&quot;separator&quot;</span><span class=\"p\">,)</span>\n</code></pre></div>\n</section>\n<section id=\"changing-a-custom-field-s-base-class\">\n<h3>Alterando a classe básica de um campo personalizado<a class=\"heading-anchor\" href=\"#changing-a-custom-field-s-base-class\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Você não pode alterar a classe base de um campo personalizado porque o Django não irá detectar a mudança, e não irá fazer uma migração para ele. Por exemplo, se você começar com:</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> <span class=\"o\">...</span>\n</code></pre></div>\n<p>e decidir que quer usar um <code class=\"docutils literal notranslate\"><span class=\"pre\">TextFeld</span></code> no lugar, você não pode mudar a classe base como estea aqui:</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> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Ao invés, você deve criar uma nova classe de campo personalizado e atualizar seu modelo para referenciá-la.</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> <span class=\"o\">...</span>\n\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> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Como discutido em <a class=\"reference internal\" href=\"/pt-br/6.1/topics/migrations/#migrations-removing-model-fields\"><span class=\"std std-ref\">removendo campos</span></a>, você deve manter a classe <code class=\"docutils literal notranslate\"><span class=\"pre\">CustomCharField</span></code> original enquanto tiver migrações que façam referência a ela.</p>\n</section>\n<section id=\"documenting-your-custom-field\">\n<h3>Documentando o seu campo customizado<a class=\"heading-anchor\" href=\"#documenting-your-custom-field\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Como sempre, você deve documentar seu tipo de campo, para que os usuários saibam o que é. Além de fornecer uma docstring para ele, que é útil para desenvolvedores, você também pode permitir que os usuários do aplicativo admin vejam uma breve descrição do tipo de campo por meio do aplicativo <span class=\"xref std std-doc\">django.contrib.admindocs `. Para fazer isso, forneça um texto descritivo em um atributo de classe :attr:`~Field.description</span> de seu campo personalizado. No exemplo acima, a descrição exibida pelo aplicativo <code class=\"docutils literal notranslate\"><span class=\"pre\">admindocs</span></code> para um <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> será ‘Uma mão de cartas (estilo bridge)’.</p>\n<p>No display do <a class=\"reference internal\" href=\"/pt-br/6.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>, a descrição do campo é interpolada com <code class=\"docutils literal notranslate\"><span class=\"pre\">field.__dict__</span></code> o qual habilita a descrição incorporar argumentos do campo. Por exemplo, a descrição para <a class=\"reference internal\" href=\"/pt-br/6.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> é:</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>Métodos úteis<a class=\"heading-anchor\" href=\"#useful-methods\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Uma vez criada a subclasse de <a class=\"reference internal\" href=\"/pt-br/6.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>, você deve considerar sobrescrever um poucos métodos, dependendo do comportamento do seu campo. A lista de métodos abaixo está mais ou menos em uma ordem decrescente de importância, então comece do topo.</p>\n<section id=\"custom-database-types\">\n<span id=\"id1\"></span><h4>Tipos de banco de dados personalizados<a class=\"heading-anchor\" href=\"#custom-database-types\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Vamos dizer que você tenha criado um tipo personalizado para o PostgreSQL chamado <code class=\"docutils literal notranslate\"><span class=\"pre\">mytype</span></code>. Você pode herdar de <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> e implementar o método <a class=\"reference internal\" href=\"/pt-br/6.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>, como 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\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=\"s2\">&quot;mytype&quot;</span>\n</code></pre></div>\n<p>Uma vez que tenha <code class=\"docutils literal notranslate\"><span class=\"pre\">MyTypeField</span></code>, pode usá-lo em qualquer modelo, tal como qualquer outro tipo <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">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>Se você deseja criar um aplicativo independente de banco de dados, deve considerar as diferenças nos tipos de colunas. Por exemplo, o tipo de coluna de data/hora no PostgreSQL é chamado “timestamp”, enquanto a mesma coluna no MySQL é chamada “datetime”. Você pode lidar com isso em um método <a class=\"reference internal\" href=\"/pt-br/6.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>  verificando o atributo “connection.vendor”. Os fornecedores integrados atuais são: “sqlite”, “postgresql”, “mysql” e “oracle”.</p>\n<p>Por exemplo:</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\">vendor</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;mysql&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;datetime&quot;</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;timestamp&quot;</span>\n</code></pre></div>\n<p>Os métodos <a class=\"reference internal\" href=\"/pt-br/6.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> e <a class=\"reference internal\" href=\"/pt-br/6.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> são chamados pelo Django quando o framework constrói comandos <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code> para a sua aplicação –  isto é, quando você cria as tabelas pela primeira vez. Os métodos também são chamados quando constróem cláusulas <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> que incluem um campo de modelo – isto é, quando você retorna dados usando métodos QuerySet como <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, e <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> e tem um campo de modelo como argumento.</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\nhardcoded in the <code class=\"docutils literal notranslate\"><span class=\"pre\">db_type()</span></code> method. For example, it wouldn’t make much sense\nto 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 hardcoded 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=\"s2\">&quot;char(25)&quot;</span>\n\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>O melhor jeito de fazer isso seria fazer o parâmetro ser especificado em tempo de execução – isto é, quando a classe é instanciada. Para fazer isso, basta implementar <code class=\"docutils literal notranslate\"><span class=\"pre\">Field.__init__()</span></code>, como em:</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=\"s2\">&quot;char(</span><span class=\"si\">%s</span><span class=\"s2\">)&quot;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_length</span>\n\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>Finalmente, se sua coluna requer uma configuração SQL realmente complexa, retorne <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> do <a class=\"reference internal\" href=\"/pt-br/6.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>. Isso irá fazer que o código de criação de SQL do Django ignore este campo. Então você é responsável por criar a coluna na tabela correta de alguma outra maneira, mas isso é uma maneira de dizer ao Django para sair do caminho.</p>\n<p>O método <a class=\"reference internal\" href=\"/pt-br/6.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> é chamado por campos como o  <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> e o <code class=\"docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code> que apontam para outros campos para determinar o tipo da sua coluna de banco de dados. Por exemplo, se tiver um <code class=\"docutils literal notranslate\"><span class=\"pre\">UnsignedAutoField</span></code>, você também precisa de chaves estrangeiras que apontam para aquele campo para usar o mesmo tipo de dado:</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=\"s2\">&quot;integer UNSIGNED AUTO_INCREMENT&quot;</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=\"s2\">&quot;integer UNSIGNED&quot;</span>\n</code></pre></div>\n</section>\n<section id=\"converting-values-to-python-objects\">\n<span id=\"id2\"></span><h4>Convertendo valores para objetos Python<a class=\"heading-anchor\" href=\"#converting-values-to-python-objects\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Se sua classe customizada de <a class=\"reference internal\" href=\"/pt-br/6.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> lida com estruturas de dados mais complexas que  strings, datas, inteiros, or floats, então talvez precise sobrescrever o <a class=\"reference internal\" href=\"/pt-br/6.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> e <a class=\"reference internal\" href=\"/pt-br/6.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>Se presente para a subclasse do campo, <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code> será chamado em todas as circunstâncias quando dados são lidos do banco de dados, incluindo em agregacões e chamadas do <a class=\"reference internal\" href=\"/pt-br/6.1/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a> .</p>\n<p>o <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code> é chamado pela deserialização e durante o método <a class=\"reference internal\" href=\"/pt-br/6.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> usado nos forms.</p>\n<p>Como regra geral, <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>to_python()``deve lidar tranquilamente com qualquer dos seguintes argumentos:</p>\n<ul class=\"simple\">\n<li><p>Uma instância do tipo correto (ex., <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Hand``no nosso exemplo corrente).</p></li>\n<li><p>Uma string</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">None``(se</span> <span class=\"pre\">o</span> <span class=\"pre\">campo</span> <span class=\"pre\">permitir</span> <span class=\"pre\">``null=True</span></code>)</p></li>\n</ul>\n<p>Na nossa classe <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>, estamos armazendo os dados como campo VARCHAR no banco de dados, então precisamos ser capazes de processar strings e <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> no <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code>. No <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, precisamos também lidar com instâncias de <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">re</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ValidationError</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\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=\"s2\">&quot;.</span><span class=\"si\">{26}</span><span class=\"s2\">&quot;</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=\"s2\">&quot;..&quot;</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\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>Perceba que sempre retornamos uma instância destes métodos. Este é o tipo do objeto Python que queremos armazenar no atributo do modelo.</p>\n<p>Para <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, se qualquer coisa der errado durante a conversão do valor, deve-se gerar a exceção <a class=\"reference internal\" href=\"/pt-br/6.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a>.</p>\n</section>\n<section id=\"converting-python-objects-to-query-values\">\n<span id=\"id3\"></span><h4>Convertendo objetos Python para valores em queries<a class=\"heading-anchor\" href=\"#converting-python-objects-to-query-values\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Uma vez que usar um banco de dados requer conversão em ambos os sentidos, se você sobrescrever <a class=\"reference internal\" href=\"/pt-br/6.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> é necessário sobrescrever também <a class=\"reference internal\" href=\"/pt-br/6.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> para converter os objetos Python de novo em valores de query.</p>\n<p>Por exemplo:</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=\"s2\">&quot;&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span>\n            <span class=\"p\">[</span><span class=\"s2\">&quot;&quot;</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> <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        <span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Aviso</p>\n<p>Caso seu campo personalizado use os tipos <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> parao MySQL, assegure que o <a class=\"reference internal\" href=\"/pt-br/6.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> sempre retorne um tipo string. O MySQL responde a pesquisa de maneira variável e inesperada quando uma query é executada com estes tipos e o valor fornecido é um inteiro, o que pode resultar em queries qeu contenham objetos inesperados nos seus resultados. Este problema não pode ocorrer se sempre retornar um tipo string do <a class=\"reference internal\" href=\"/pt-br/6.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>Convertendo valores de queries para valores de banco de dados<a class=\"heading-anchor\" href=\"#converting-query-values-to-database-values\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Alguns tipos de dados (por exemplo datas) precisam estar em um formato específico antes deles poderem ser usados por um “backend” de banco de dados. O <a class=\"reference internal\" href=\"/pt-br/6.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> é um método onde estas conversões devem ser feitas. A conexão específica que será usada para a query é passada pelo parâmetro <code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></code>. Isso lhe possibilita usar a lógica de conversão espeçifica para um backend se isso for necessário.</p>\n<p>Por exemplo, o Django usa o seguinte método para isso <a class=\"reference internal\" href=\"/pt-br/6.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>No caso do seu campo personalizado precisar de uma conversão especial quando for salvo e isso não é o mesmo que a conversão usada para parâmetros de query, você pode sobrescrever <a class=\"reference internal\" href=\"/pt-br/6.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>Processando valores antes de salvar<a class=\"heading-anchor\" href=\"#preprocessing-values-before-saving\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Caso queira processar o valor logo antes de salvar, pode-se usar <a class=\"reference internal\" href=\"/pt-br/6.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>. Por exemplo, o <a class=\"reference internal\" href=\"/pt-br/6.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> do Django usa este método para definir o atributo corretamente no caso de <a class=\"reference internal\" href=\"/pt-br/6.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>  ou <a class=\"reference internal\" href=\"/pt-br/6.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>Caso sobrescreva este método, é necessário retornar o valor do atributo no fim. Deve-se também atualizar o atributo do modelo caso tenham sido feito mudanças no valor, de modo que que o código que mantém as referências ao modelo sempre veja o valor correto.</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>Especificando o campo de um formulário para o campo de um modelo.<a class=\"heading-anchor\" href=\"#specifying-the-form-field-for-a-model-field\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Para personalizar o campo de formulário usado pelo <a class=\"reference internal\" href=\"/pt-br/6.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>, você pode sobrescrever <a class=\"reference internal\" href=\"/pt-br/6.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>A classe do campo de formulário pode ser especificada via o <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> e os argumentos de  <code class=\"docutils literal notranslate\"><span class=\"pre\">choices_form_class</span></code>; o último é especificado se o campo tiver opções (choices) especificadas, do contrário o primeiro. Se estes argumentos não são fornecidos, será usada a <a class=\"reference internal\" href=\"/pt-br/6.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> ou <a class=\"reference internal\" href=\"/pt-br/6.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>.</p>\n<p>Todos os dicionários <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> é passado diretamente para o método __init__()` do campo do formulário. Normalmente, tudo o que você precisa fazer é definir um bom padrão para o argumento do  <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> (e talvez <code class=\"docutils literal notranslate\"><span class=\"pre\">choices_form_class</span></code>) e delegar futuras manipulações para a classe pai. Isso talvez requeira que seja escrito um campo de form personalizado (e mesmo o widget de formulário). Veja o <a class=\"reference internal\" href=\"/pt-br/6.1/topics/forms/\"><span class=\"doc\">forms documentation</span></a> para informações sobre isso.</p>\n<p>If you wish to exclude the field from the <a class=\"reference internal\" href=\"/pt-br/6.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\ncan override the <a class=\"reference internal\" href=\"/pt-br/6.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 to return <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>.</p>\n<p>Continuando nosso exemplo em andamento, podemos escrever o método <a class=\"reference internal\" href=\"/pt-br/6.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>  como:</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\"># Exclude the field from the ModelForm when some condition is met.</span>\n        <span class=\"n\">some_condition</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;some_condition&quot;</span><span class=\"p\">,</span> <span class=\"kc\">False</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">some_condition</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n        <span class=\"c1\"># Set up some defaults while letting the caller override them.</span>\n        <span class=\"n\">defaults</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;form_class&quot;</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>Isso assume que importamos uma classe de campo <code class=\"docutils literal notranslate\"><span class=\"pre\">MyModelField</span></code> (o qual tem seu próprio widget padrão). Este documento não cobre os detalhes de escrever um campo de formulário personalizado.</p>\n</section>\n<section id=\"emulating-built-in-field-types\">\n<span id=\"id6\"></span><h4>Emulando tipos de campos internos.<a class=\"heading-anchor\" href=\"#emulating-built-in-field-types\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Se você criou um método <a class=\"reference internal\" href=\"/pt-br/6.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>, não precisa se preocupar sobre  <a class=\"reference internal\" href=\"/pt-br/6.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> – isso não será usado muito. As vezes, porém, seu armazenamento no banco de dados é similar em tipo a outro campo, então você pode usar a lógica deste outro campo para criar a coluna correta.</p>\n<p>Por exemplo:</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=\"s2\">&quot;CharField&quot;</span>\n</code></pre></div>\n<p>Não importa qual backend de banco de dados que esteja sendo usado, isso quer dizer que  o <a class=\"reference internal\" href=\"/pt-br/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> e outros comandos SQL criam o tipo de coluna correto para armazenar uma string.</p>\n<p>Se o <a class=\"reference internal\" href=\"/pt-br/6.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>  retorna uma string que não é conhecida para o Django para o backend de banco de dados que está sendo usado – que é, ele não aparece no  <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends.&lt;db_name&gt;.base.DatabaseWrapper.data_types</span></code> – a string ainda será usada pelo serializador, mas o método padrão <a class=\"reference internal\" href=\"/pt-br/6.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> retornará <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Veja a documentação do <a class=\"reference internal\" href=\"/pt-br/6.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> pelas razões pelas quais este talvez seja útil.</p>\n</section>\n<section id=\"converting-field-data-for-serialization\">\n<span id=\"converting-model-field-to-serialization\"></span><h4>Convertendo dado do campo para serialização<a class=\"heading-anchor\" href=\"#converting-field-data-for-serialization\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Para personalizar como os valores são serializados por um serializador, você pode sobrescrever :meth:’~Field.value_to_string’. Utilizando :meth:’~Field.value_from_object’ é a melhor forma para obter o valor dos campos antes da serialização. Por exemplo, visto que “HandField” utiliza strings para armazenar dados, nós podemos reutilizar algum código de conversão existente:</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>Alguns avisos gerais<a class=\"heading-anchor\" href=\"#some-general-advice\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Escrever um um campo personalizado pode ser um um pouco complicado, particularmente se estiver fazendo conversões complexas entre tipos Python e o banco de dados e formatos de serialização. Aqui algumas dicas par fazer as coisas mais tranquilas.</p>\n<ol class=\"arabic simple\">\n<li><p>Olhe para os campos existentes no Django  (em <code class=\"file docutils literal notranslate\"><span class=\"pre\">django/db/models/fields/__init__.py</span></code>)  para inspiração. Tente encontrar um campo que seja similar ao o que você quer extender um pouco, ao invés de criar um inteiramente novo do zero.</p></li>\n<li><p>Coloque o método <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> na classe que você está utilizando para envelopar o campo. Em vários lugares o comportamento padrão do código do campo é chamar <code class=\"docutils literal notranslate\"><span class=\"pre\">str()</span></code>. (Em nossos exemplos neste documento, <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> seria uma instância de <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> e não de <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>). Então se o método <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> da sua classe converter o objeto para o formato de texto, você poderá poupar bastante trabalho.</p></li>\n</ol>\n</section>\n</section>\n<section id=\"writing-a-filefield-subclass\">\n<h2>Escrevendo uma subclasse  <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code><a class=\"heading-anchor\" href=\"#writing-a-filefield-subclass\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Além dos métodos acima, campos que lidam com arquivos tem alguns outros requerimentos especiais que devem ser levados em conta. A maioria dos mecanismos fornecidos pelo <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>FileField`, como controlar o armazenamento e leitura na base de dados, podem permanecer inalterados, deixando as subclasses lidarem com o desafio de dar suporte a um tipo de arquivo particular.</p>\n<p>O Django fornece uma classe <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code>, a qual é usada como um proxy para conteúdos e operações de arquivos . Isso pode ser herdado para customizar como o arquivo é acessado, e quais métodos estão disponíveis. Isso está em <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.fields.files</span></code>, e seu comportamento padrão é explicado no <a class=\"reference internal\" href=\"/pt-br/6.1/ref/files/file/\"><span class=\"doc\">arquivo documentação</span></a>.</p>\n<p>Assim que uma subclasse de <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> é criada, a nova subclasse de <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> precisa ser informada para usá-la. Para fazer isso, atribua a nova subclasse <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> para o atributo especial <code class=\"docutils literal notranslate\"><span class=\"pre\">attr_class</span></code> na subclasse <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code>.</p>\n<section id=\"a-few-suggestions\">\n<h3>Algumas sugestões<a class=\"heading-anchor\" href=\"#a-few-suggestions\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Além dos detalhes acima, tem algumas orientações as quais podem melhorar muito a eficiência e a legibilidade do código do campo.</p>\n<ol class=\"arabic simple\">\n<li><p>O código fonte para o  <code class=\"docutils literal notranslate\"><span class=\"pre\">ImageField</span></code> do Django (em <code class=\"docutils literal notranslate\"><span class=\"pre\">django/db/models/fields/files.py</span></code>) é um bom exemplo de como herdar <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> para dar suporte ao um tipo de arquivo em particular, já que ele incorpora todas as técnicas descritas acima.</p></li>\n<li><p>Faça o cache dos atributos do arquivo sempre que possível. Uma vez que é possível que arquivos sejam armazenados em sistemas de armazenamento remotos, recuperá-los talvez requeira tempo extra, ou mesmo dinheiro, que não é sempre necessário. Uma vez que o arquivo é recuperado para obter alguns dados sobre seu conteúdo, faça o cache de dados o quanto possível para reduzir o número de vezes que o arquivo deve ser recuperado em chamadas subsequentes para aquela informação.</p></li>\n</ol>\n</section>\n</section>","rootId":"how-to-create-custom-model-fields","toc":[{"title":"Introdução","anchor":"introduction","children":[{"title":"Nosso objeto de exemplo","anchor":"our-example-object","children":[]}]},{"title":"A teoria por trás.","anchor":"background-theory","children":[{"title":"Armazenamento no Banco de Dados.","anchor":"database-storage","children":[]},{"title":"O que uma classe campo faz?","anchor":"what-does-a-field-class-do","children":[]}]},{"title":"Escrevendo uma subclasse de campo","anchor":"writing-a-field-subclass","children":[{"title":"A descontrução do Campo","anchor":"field-deconstruction","children":[]},{"title":"Atributos de campo que não afetam a definição da coluna do banco de dados","anchor":"field-attributes-not-affecting-database-column-definition","children":[]},{"title":"Alterando a classe básica de um campo personalizado","anchor":"changing-a-custom-field-s-base-class","children":[]},{"title":"Documentando o seu campo customizado","anchor":"documenting-your-custom-field","children":[]},{"title":"Métodos úteis","anchor":"useful-methods","children":[{"title":"Tipos de banco de dados personalizados","anchor":"custom-database-types","children":[]},{"title":"Convertendo valores para objetos Python","anchor":"converting-values-to-python-objects","children":[]},{"title":"Convertendo objetos Python para valores em queries","anchor":"converting-python-objects-to-query-values","children":[]},{"title":"Convertendo valores de queries para valores de banco de dados","anchor":"converting-query-values-to-database-values","children":[]},{"title":"Processando valores antes de salvar","anchor":"preprocessing-values-before-saving","children":[]},{"title":"Especificando o campo de um formulário para o campo de um modelo.","anchor":"specifying-the-form-field-for-a-model-field","children":[]},{"title":"Emulando tipos de campos internos.","anchor":"emulating-built-in-field-types","children":[]},{"title":"Convertendo dado do campo para serialização","anchor":"converting-field-data-for-serialization","children":[]}]},{"title":"Alguns avisos gerais","anchor":"some-general-advice","children":[]}]},{"title":"Escrevendo uma subclasse  FileField","anchor":"writing-a-filefield-subclass","children":[{"title":"Algumas sugestões","anchor":"a-few-suggestions","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/pt-br/6.1/howto/"}],"prev":{"docname":"howto/legacy-databases","title":"How to integrate Django with a legacy database","url":"/pt-br/6.1/howto/legacy-databases/"},"next":{"docname":"howto/writing-migrations","title":"How to create database migrations","url":"/pt-br/6.1/howto/writing-migrations/"},"formats":{"html":"/pt-br/6.1/howto/custom-model-fields/","markdown":"/pt-br/6.1/howto/custom-model-fields.md","json":"/pt-br/6.1/howto/custom-model-fields.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/howto/custom-model-fields.txt","official":"https://docs.djangoproject.com/pt-br/6.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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}