{"title":"Come creare model field personalizzati","version":"6.0","locale":"it","docname":"howto/custom-model-fields","url":"/it/6.0/howto/custom-model-fields/","canonical":"https://djangodocs.dev/it/6.0/howto/custom-model-fields/","summary":"Introduzione Link to this heading # La documentazione model reference spiega come usare i campi delle classi standard di Django – CharField , DateField , ecc. La…","html":"<h1>Come creare model field personalizzati<a class=\"heading-anchor\" href=\"#how-to-create-custom-model-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"introduction\">\n<h2>Introduzione<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>La documentazione <a class=\"reference internal\" href=\"/it/6.0/topics/db/models/\"><span class=\"doc\">model reference</span></a> spiega come usare i campi delle classi standard di Django – <a class=\"reference internal\" href=\"/it/6.0/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=\"/it/6.0/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>, ecc. La maggior parte delle volte, queste classi sono tutto ciò di cui hai bisogno. A volte, però, la versione di Django non incontrerà precisamente i tuoi requisiti o vorrai usare un campo che è totalmente differente da quelli che sono forniti con Django.</p>\n<p>I tipi di campi built-in di Django non coprono ogni possibile tipologia di colonna di database – sono i tipi più comuni, come <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">INTEGER</span></code>. Per tipi di colonne più oscuri, come poligoni geografici o anche tipi creati dall’utente come i <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-createtype.html\">PostgreSQL custom types</a>, puoi definire le tue sottoclassi di Django <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>.</p>\n<p>Alternativamente, puoi avere un oggetto Python complesso che può essere serializzato in qualche modo per essere accolto in un tipo di colonna standard di database. Questo è un ulteriore caso in cui una sottoclasse di <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> ti aiuterà ad usare il tuo oggetto con i tuoi modelli.</p>\n<section id=\"our-example-object\">\n<h3>Il nostro oggetto di esempio<a class=\"heading-anchor\" href=\"#our-example-object\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Creating custom fields requires a bit of attention to detail. To make things\neasier to follow, we’ll use a consistent example throughout this document:\nwrapping a Python object representing the deal of cards in a hand of <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Contract_bridge\">Bridge</a>.\nDon’t worry, you don’t have to know how to play Bridge to follow this example.\nYou only need to know that 52 cards are dealt out equally to four players, who\nare traditionally called <em>north</em>, <em>east</em>, <em>south</em> and <em>west</em>. Our class looks\nsomething like this:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Hand</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;A hand of cards (bridge style)&quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">north</span><span class=\"p\">,</span> <span class=\"n\">east</span><span class=\"p\">,</span> <span class=\"n\">south</span><span class=\"p\">,</span> <span class=\"n\">west</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Input parameters are lists of cards (&#39;Ah&#39;, &#39;9s&#39;, etc.)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">north</span> <span class=\"o\">=</span> <span class=\"n\">north</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">east</span> <span class=\"o\">=</span> <span class=\"n\">east</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">south</span> <span class=\"o\">=</span> <span class=\"n\">south</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">west</span> <span class=\"o\">=</span> <span class=\"n\">west</span>\n\n    <span class=\"c1\"># ... (other possibly useful methods omitted) ...</span>\n</code></pre></div>\n<p>Questa è una classe Python ordinaria, senza niente che sia specifico di Django. Ci piacerebbe fare cose come questa nel nostro modello (assumiamo che l’attributo «hand» sul modello sia istanza di <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>Assegniamo e ritiriamo l’attributo <code class=\"docutils literal notranslate\"><span class=\"pre\">hand</span></code> nel nostro modello proprio come qualsiasi altra classe Python. Il trucco è dire a Django come gestire il salvataggio ed il caricamento su e da questo oggetto.</p>\n<p>Per usare la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> nei nostri models, <em>non</em> dobbiamo cambiare assolutamente la classe. Questo è l’ideale, perchè significa che puoi scrivere facilmente modelli che supportano classi esistenti dove non puoi cambiare il codice sorgente.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Potresti anche solo voler trarre vantaggio dai tipi custom per le colonne di database ed avere a che fare con i dati come tipi standard di Python nei modelli; stringhe o float, per esempio. Questo caso è simile al nostro esempio <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> e terremo nota delle differenze andando avanti.</p>\n</aside>\n</section>\n</section>\n<section id=\"background-theory\">\n<h2>Teoria di Background<a class=\"heading-anchor\" href=\"#background-theory\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"database-storage\">\n<h3>Stoccaggio DB<a class=\"heading-anchor\" href=\"#database-storage\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Cominciamo con i campi di model. Se lo riduci ai minimi termini, un campo model offre un modo di prendere un normale oggetto Python – stringa, booleano, <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> or qualcosa di più complesso come <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> –  e convertirlo a e da un formato che è utile quando si ha a che fare con il database. (Questo formato è anche utile per la serializzazione ma, come vedremo più tardi, è una cosa facile una volta che hai sotto controllo il database).</p>\n<p>I campi di un modello devono in qualche modo essere convertiti per stare in un tipo esistente di colonna di database. Diversi database offrono diversi set di tipi di colonna validi ma la regola è sempre la stessa: sono gli unici tipi con cui puoi lavorare. Qualsiasi cosa tu voglia scrivere sul database, deve poter essere rappresentato con quei tipi.</p>\n<p>Normalmente, stai scrivendo un campo Django che sia consono per uno dei tipi di colonna del database oppure ti servirà un modo di convertire i tuoi dati, per dire, in una stringa.</p>\n<p>Per il nostro esempio <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code>, potremmo convertire i dati della carta in una stringa di 104 caratteri concatenando tutte le carte insieme in un ordine predeterminato – diciamo, prima tutte le carte <em>nord</em>, poi <em>est</em>, * carte sud* e <em>ovest</em>. In questo modo gli oggetti <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> possono essere salvati in colonne testuali o di caratteri nel database.</p>\n</section>\n<section id=\"what-does-a-field-class-do\">\n<h3>Cosa fa una classe di campo?<a class=\"heading-anchor\" href=\"#what-does-a-field-class-do\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Tutti i campi Django (e quando parliamo di <em>campi</em> in questo documento, intendiamo sempre campi del modello e non <a class=\"reference internal\" href=\"/it/6.0/ref/forms/fields/\"><span class=\"doc\">form fields</span></a>) sono sottoclassi di <a class=\"reference internal\" href=\"/it/6.0/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>. La maggior parte delle informazioni che Django registra su un campo sono comuni per tutti i campi – nome, testo di aiuto, unicità e così via. La registrazione di tutte quelle informazioni è gestita da <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>. Ci addentreremo nei dettagli di ciò che <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> può fare più tardi; per ora, è sufficiente dire che ogni cosa discende da <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> e poi personalizza pezzi chiave del comportamento della classe.</p>\n<p>E” importante capire che una classe per un campo di Django non è quel che è salvato negli attributi del model. Gli attributi del model contengono oggetti Python normali. Le classi per i campi che definisci in un model sono salvati nella classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> quando la classe del model viene creata (i dettagli precisi di come questo avvenga ora non sono importanti). Questo accade perchè le classi dei campi non sono necessarie quando stai creando o modificando attributi. Invece, offrono i meccanismi per convertire il valore dell’attributo in quel che viene salvato sul database o mandato al  <a class=\"reference internal\" href=\"/it/6.0/topics/serialization/\"><span class=\"doc\">serializzatore</span></a>.</p>\n<p>Tieni a mente questo quando crei i tuoi campi personalizzati. La sottoclasse <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> di Django che scrivi offre i meccanismi per la conversione tra le tue istanze di Python ed i valori del database/serializzatore in diversi modi (ci sono differenze tra salvare un valore ed usarlo per un lookup, per esempio). Se ti sembra un po” complicato, non preoccuparti – diverrà più chiaro negli esempi che seguono. Ricordati solo che finirai spesso a creare due classi quando vuoi un campo personalizzato:</p>\n<ul class=\"simple\">\n<li><p>La prima classe è l’oggetto Python che i tuoi utenti manipoleranno. Lo assegneranno all’attributo model, leggeranno da esso per la visualizzazione, cose del genere. Questa è la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> nel nostro esempio.</p></li>\n<li><p>La seconda classe è la sottoclasse <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>. Questa è la classe che sa come riconvertire la tua prima classe avanti ed indietro tra la sua forma di salvataggio permanente e la sua forma in Python.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"writing-a-field-subclass\">\n<h2>Scrivere una sottoclasse di campo<a class=\"heading-anchor\" href=\"#writing-a-field-subclass\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Quando pianifichi la tua sottoclasse <a class=\"reference internal\" href=\"/it/6.0/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>, prova a pensare a quale classe <a class=\"reference internal\" href=\"/it/6.0/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> esistente somigli. Puoi fare una sottoclasse di un campo Django esistente e risparmiarti un po” di lavoro? Se non puoi, dovresti fare una sottoclasse di <a class=\"reference internal\" href=\"/it/6.0/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>, dalla quale tutto discende.</p>\n<p>Inizializzare il tuo nuovo campo è questione di fare una separazione tra gli argomenti che sono specifici per il tuo caso da quelli comuni e passare questi ultimi nel metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> di <a class=\"reference internal\" href=\"/it/6.0/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> (o della tua classe padre).</p>\n<p>Nel nostro esempio, chiameremo il nostro campo <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>. (E” una buona idea chiamare la tua sottoclasse di <a class=\"reference internal\" href=\"/it/6.0/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;Something&gt;Field</span></code>, così che sia facilmente identificabile come <a class=\"reference internal\" href=\"/it/6.0/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> subclass.). Non deve comportarsi come alcun campo esistente, così faremo direttamente una sottoclasse di <a class=\"reference internal\" href=\"/it/6.0/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>Il nostro <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> accetta la maggior parte delle opzioni standard per un campo (vedi la lista qui sotto) ma ci assicuriamo che abbia una lunghezza fissa, perchè necessita di tenere solo i valori delle 52 carte più i loro semi; 104 caratteri in tutto.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Molti dei modelli di Django accettano opzioni con le quali poi non fanno niente. Per esempio, puoi passare sia <a class=\"reference internal\" href=\"/it/6.0/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> che <a class=\"reference internal\" href=\"/it/6.0/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> ad una <a class=\"reference internal\" href=\"/it/6.0/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.db.models.DateField</span></code></a> ed ignorerà il parametro <a class=\"reference internal\" href=\"/it/6.0/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> (impostare <a class=\"reference internal\" href=\"/it/6.0/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> implica <code class=\"docutils literal notranslate\"><span class=\"pre\">editable=False</span></code>). Non viene sollevato alcun errore in questo caso.</p>\n<p>Questo comportamento semplifica le classi per i campi perchè non hanno bisogno di controllare le opzioni che non sono necessarie. Passano tutte le opzioni al padre e poi non le usano. Sta a te essere più o meno esigente riguardo alle opzioni che selezionano o utilizzare il comportamento più permissivo per i campi correnti.</p>\n</aside>\n<p>Il metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">Field.__init__()</span></code> accetta i seguenti parametri:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/it/6.0/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=\"/it/6.0/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=\"/it/6.0/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=\"/it/6.0/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=\"/it/6.0/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=\"/it/6.0/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=\"/it/6.0/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>: Usato per campi collegati (come <a class=\"reference internal\" href=\"/it/6.0/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>). Solo per utenti avanzati.</p></li>\n<li><p><a class=\"reference internal\" href=\"/it/6.0/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=\"/it/6.0/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>, il campo non verrà serializzato quando viene passato ai <a class=\"reference internal\" href=\"/it/6.0/topics/serialization/\"><span class=\"doc\">serializers</span></a> di Django. Di default a <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/it/6.0/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=\"/it/6.0/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=\"/it/6.0/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=\"/it/6.0/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=\"/it/6.0/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=\"/it/6.0/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=\"/it/6.0/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>: solo per la creazione dell’indice, se il backend supporta <a class=\"reference internal\" href=\"/it/6.0/topics/db/tablespaces/\"><span class=\"doc\">tablespaces</span></a>. Generalmente puoi ignorare questa opzione.</p></li>\n<li><p><a class=\"reference internal\" href=\"/it/6.0/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 il campo è stato creato automaticamente, come per <a class=\"reference internal\" href=\"/it/6.0/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>, usato per l’ereditarietà del model. Solo per uso avanzato.</p></li>\n</ul>\n<p>Tutte le opzioni che non hanno una spiegazione nella lista precedente hanno lo stesso significato che avrebbero nei normali campi Django. Vedi la <a class=\"reference internal\" href=\"/it/6.0/ref/models/fields/\"><span class=\"doc\">documentazione dei campi</span></a> per esempi e dettagli.</p>\n<section id=\"field-deconstruction\">\n<span id=\"custom-field-deconstruct-method\"></span><h3>Scomposizione di un campo<a class=\"heading-anchor\" href=\"#field-deconstruction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Il duale rispetto allo scrivere il metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> è scrivere il metodo <a class=\"reference internal\" href=\"/it/6.0/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>. Viene utilizzato durante <span class=\"xref std std-doc\">model migrations</span> per dire a Django come prendere un’istanza del tuo nuovo campo e ridurlo ad una forma serializzata, in particolare, quali argomenti passare a <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> per ricrearlo.</p>\n<p>Se non hai aggiunto opzioni extra sul campo dal quale hai ereditato, allora non c’è bisogno di scrivere un nuovo metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code>. Se, comunque, stai cambiando gli argomenti da passare ad <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> (come stiamo facendo in <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>), avrai bisogno di integrare i valori da passare.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> restituisce una tupla di 4 elementi: il nome dell’attributo del campo, l’import path completo della classe del campo, i positional arguments (come lista) ed i keyword arguments (come dizionario). Nota che questo è differente dal metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> <a class=\"reference internal\" href=\"/it/6.0/topics/migrations/#custom-deconstruct-method\"><span class=\"std std-ref\">per la classi custom</span></a> che restituisce una tupla di tre cose.</p>\n<p>Come autore di un campo custom, non devi preoccuparti dei primi due valori; la classe di base <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> ha tutto il codice per gestire l’attributo relativo al nome del campo ed al percorso di importazione. Devi, in ogni caso, fare attenzione ai positional e keyword arguments, perchè molto probabilmente sono quelli che stai cambiando.</p>\n<p>Per esempio, nella nostra classe <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> stiamo già forzosamente impostando max_length in <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code>. Il metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> sulla classe base <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> ne terrà conto e cercherà di restituirlo tra i keyword arguments; quindi, possiamo eliminarlo dai keyword arguments per questioni di leggibilità:</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 aggiungi un nuovo keyword argument, dovrai scrivere da te del codice in <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> che metta il suo valore in <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code>. Dovresti anche omettere il valore da <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code>  quando non sia necessario ricostruire lo stato del campo, per esempio quando se ne usa il valore predefinito:</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>Esempi più complessi sono oltre le finalità di questo documento ma ricorda - per ogni configurazione della tua istanza di Field, <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> deve restituire argomenti che si possano passare ad <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> per ricostruire lo stato.</p>\n<p>Fai particolarmente attenzione se imposti nuovi valori di default nella superclasse di <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>; vuoi essere sicuro che siano sempre inclusi piuttosto che sparire se dovessero riprendere il vecchio valore di default.</p>\n<p>Inoltre, cerca di evitare di restituire valori come positional arguments; dove possibile, restituisci valori come argomenti keyword per massimizzare la compatibilità futura. Se cambi il nome delle cose più spesso della loro posizione nella lista di argomenti del costruttore, potresti preferire i positional ma tieni in mente che molte persone ricostruiranno il campo a partire dalla versione serializzata per un po” (anche anni), dipendentemente da quanto a lungo vivranno le tue migrazioni.</p>\n<p>Puoi osservare i risultati della decostruzione guardando nelle migrazioni che includono il campo, e puoi testare la decostruzione negli unit test, decostruendo e ricostruendo il 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>Attributi di campo che non interessano la definizione di colonne di database<a class=\"heading-anchor\" href=\"#field-attributes-not-affecting-database-column-definition\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Puoi sovrascrivere <code class=\"docutils literal notranslate\"><span class=\"pre\">Field.non_db_attrs</span></code> per personalizzare gli attributi di un campo che non influiscono sulla definizione di una colonna. Viene utilizzato durante le migrazioni dei modelli per rilevare <code class=\"docutils literal notranslate\"><span class=\"pre\">AlterField</span></code> no-op.</p>\n<p>Per esempio:</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>Cambiare la classe base di un campo personalizzato<a class=\"heading-anchor\" href=\"#changing-a-custom-field-s-base-class\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Non puoi cambiare la classe base di un campo custom perchè Django non si accorgerà del cambiamento e non potrà creare una migrazione di conseguenza. Per esempio, se cominci con:</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 poi decidi che vuoi usare un <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code>, non puoi cambiare la sottoclasse così:</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>Invece, devi creare una nuova classe per il campo personalizzato ed aggiornare il modello per farvi riferimento:</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>Come discusso in <a class=\"reference internal\" href=\"/it/6.0/topics/migrations/#migrations-removing-model-fields\"><span class=\"std std-ref\">rimuovere campi</span></a>, devi mantenere la classe originale <code class=\"docutils literal notranslate\"><span class=\"pre\">CustomCharField</span></code> fintanto che hai migrazione che vi facciano riferimento.</p>\n</section>\n<section id=\"documenting-your-custom-field\">\n<h3>Documentare il tuo campo personalizzato<a class=\"heading-anchor\" href=\"#documenting-your-custom-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Come sempre, dovresti documentare il tuo tipo di campo, così che gli utenti possano sapere cosa sia. Oltre a fornire una docstring, che è utile per gli sviluppatori, dovresti anche mettere in condizioni gli utenti dell’amministrazione di vedere una piccola descrizione del tipo di campo tramite l’applicazione <a class=\"reference internal\" href=\"/it/6.0/ref/contrib/admin/admindocs/\"><span class=\"doc\">django.contrib.admindocs</span></a> . Per far questo, fornisci un testo descrittivo nell’attributo di classe <a class=\"reference internal\" href=\"/it/6.0/ref/models/fields/#django.db.models.Field.description\" title=\"django.db.models.Field.description\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">description</span></code></a> del tuo campo personalizzato. Nell’esempio sopracitato, la descrizione mostrata dall’applicazione <code class=\"docutils literal notranslate\"><span class=\"pre\">admindocs</span></code> per un <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> sarà “Una mano di carte (stile bridge)”.</p>\n<p>Nella visualizzazione in <a class=\"reference internal\" href=\"/it/6.0/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>, la descrizione del campo è interpolata con <code class=\"docutils literal notranslate\"><span class=\"pre\">field.__dict__</span></code>, che consente che la descrizione incorpori gli argomenti del campo. Per esempio, la descrizione di <a class=\"reference internal\" href=\"/it/6.0/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>Metodi utili<a class=\"heading-anchor\" href=\"#useful-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Una volta che hai creato la tua sottoclasse di  <a class=\"reference internal\" href=\"/it/6.0/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>, puoi considerare di fare override di alcuni metodi standard, dipendentemente dal comportamento del tuo campo. La lista di metodi che segue è ordinata approssimativamente in ordine decrescente di importanza, quindi inizia dall’alto.</p>\n<section id=\"custom-database-types\">\n<span id=\"id1\"></span><h4>Tipi di database personalizzati<a class=\"heading-anchor\" href=\"#custom-database-types\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Supponiamo che tu abbia creato un tipo PostgreSQL custom chiamato mytype`. Puoi fare una sottoclasse di <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> ed implementare il metodo <a class=\"reference internal\" href=\"/it/6.0/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>, nel modo seguente:</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>Una volta che hai <code class=\"docutils literal notranslate\"><span class=\"pre\">MytypeField</span></code>, puoi usarlo in ogni modello, come qualsiasi altro 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 punti ad implementare una applicazione agnostica rispetto al database, dovresti tenere in considerazione le differenze nei tipi di colonna del database. Per esempio, il tipo date/time in PostgreSQL è chiamato <code class=\"docutils literal notranslate\"><span class=\"pre\">timestamp</span></code>, mentre la stessa colonna in MySQL viene chiamata <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>. Puoi gestire tutto questo in un metodo <a class=\"reference internal\" href=\"/it/6.0/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> controllando l’attributo <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.vendor</span></code>. I nomi di vendor correntemente disponibili sono: <code class=\"docutils literal notranslate\"><span class=\"pre\">sqlite</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">postgresql</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">mysql</span></code> e``oracle``.</p>\n<p>Per esempio:</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>The <a class=\"reference internal\" href=\"/it/6.0/ref/models/fields/#django.db.models.Field.db_type\" title=\"django.db.models.Field.db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">db_type()</span></code></a> and <a class=\"reference internal\" href=\"/it/6.0/ref/models/fields/#django.db.models.Field.rel_db_type\" title=\"django.db.models.Field.rel_db_type\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">rel_db_type()</span></code></a> methods are called by\nDjango when the framework constructs the <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code> statements for your\napplication – that is, when you first create your tables. The methods are also\ncalled when constructing a <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> clause that includes the model field –\nthat is, when you retrieve data using QuerySet methods like <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> and have the model field as an argument.</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>Il miglior modo di fare una cosa del genere potrebbe essere rendere il parametro specificabile a run time – per esempio, quando la classe viene istanziata. Per fare ciò, implementa così <code class=\"docutils literal notranslate\"><span class=\"pre\">Field.__init__()</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=\"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>Infine, se la tua colonna richiede davvero un setup SQL complesso, restituisci <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> da <a class=\"reference internal\" href=\"/it/6.0/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>. Questo farà in modo che Django salti questo campo durante la creazione del codice SQL. A questo punto sei in qualche modo il responsabile della creazione della colonna nella giusta tabella ma questo ti offre un modo di dire a Django di non agire.</p>\n<p>Il metodo <a class=\"reference internal\" href=\"/it/6.0/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> è chiamato da campi come <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code> che puntano ad altri campi per determinare il proprio tipo di dato per la colonna del database. Per esempio, se hai un <code class=\"docutils literal notranslate\"><span class=\"pre\">UnsignedAutoField</span></code>, hai anche bisogno delle foreign keys che puntano a quel campo e che usano lo stesso tipo di dato:</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>Conversione di valori a oggetti Python<a class=\"heading-anchor\" href=\"#converting-values-to-python-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Se la tua classe personalizzata <a class=\"reference internal\" href=\"/it/6.0/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> ha a che fare con strutture di dati che sono più complesse di stringhe, date, interi o numeri in virgola mobile, allora potresti aver bisogno di fare override di <a class=\"reference internal\" href=\"/it/6.0/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=\"/it/6.0/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 per la sottoclasse del campo, <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code> sarà chiamato in tutte le circostanze in cui i dati sono caricati dal database, incluse le aggregazioni e le chiamate <a class=\"reference internal\" href=\"/it/6.0/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code> è chiamato per la deserializzazione e nel metodo <a class=\"reference internal\" href=\"/it/6.0/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> usato dai form.</p>\n<p>Come regola generale, <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>  dovrebbe avere a che fare in modo graceful con i seguenti argomenti:</p>\n<ul class=\"simple\">\n<li><p>Una istanza del tipo corretto (per esempio <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> nel nostro esempio).</p></li>\n<li><p>Una stringa</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (se il campo permette <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>)</p></li>\n</ul>\n<p>Nella nostra classe <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>, stiamo immagazinando i dati come un campo <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> nel database, quindi dobbiamo essere in grado di processare string e <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> in from_db_value()`. In <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, dovremo anche gestire le istanze di <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>Nota che restituiamo sempre una istanza di <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> da questi metodi. Quello è il tipo di oggetto Python che vogliamo salvare nell’attributo del model.</p>\n<p>Per <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, se qualcosa va storto durante una conversione di valore, dovresti lanciare una eccezione <a class=\"reference internal\" href=\"/it/6.0/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>Convertire oggetti Python in query di valori<a class=\"heading-anchor\" href=\"#converting-python-objects-to-query-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Poichè l’utilizzo di un database richiede conversioni in entrambi i sensi, se fai override di <a class=\"reference internal\" href=\"/it/6.0/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> devi anche fare override di <a class=\"reference internal\" href=\"/it/6.0/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> per riconvertire gli oggetti Python in query values.</p>\n<p>Per esempio:</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\">Avvertimento</p>\n<p>Se il tuo campo custom usa tipi <code class=\"docutils literal notranslate\"><span class=\"pre\">CHAR</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> o <code class=\"docutils literal notranslate\"><span class=\"pre\">TEXT</span></code> per MySQL, devi assicurarti che <a class=\"reference internal\" href=\"/it/6.0/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> restituisca sempre un tipo stringa. MySQL esegue match flessibili ed inaspettati quando si esegue una query su questi tipi ed il valore che si fornisce è un integer, che può causare l’inclusione di valori inattesi nei risultati. Questo problema non si pone se restituisci sempre un tipo stringa da <a class=\"reference internal\" href=\"/it/6.0/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>Convertire query values in valori di database<a class=\"heading-anchor\" href=\"#converting-query-values-to-database-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Alcuni tipi di dato (per esempio, date) devono trovarsi in uno specifico formato prima di poter essere usati da un backend database. <a class=\"reference internal\" href=\"/it/6.0/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> è il metodo in cui si dovrebbero effettuare queste conversioni. La connessione specifica che sarà usata per la query è passata come parametro <code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></code>. Questo ti permette usare logica specifica del backend per la coversione, se questa è richiesta.</p>\n<p>Per esempio, Django usa il metodo seguente per il suo <a class=\"reference internal\" href=\"/it/6.0/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>Nel caso che il tuo campo personalizzato richieda una conversione speciale al salvataggio che non sia la stessa usata per i parametri di query, puoi fare override di <a class=\"reference internal\" href=\"/it/6.0/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>Pre elaborazione dei valori prima del salvataggio<a class=\"heading-anchor\" href=\"#preprocessing-values-before-saving\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Se vuoi preprocessare il valore proprio prima di salvarlo, puoi sare <a class=\"reference internal\" href=\"/it/6.0/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>. Per esempio, <a class=\"reference internal\" href=\"/it/6.0/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> di Django usa questo metodo per impostare l’attributo correttamente in caso di <a class=\"reference internal\" href=\"/it/6.0/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> o <a class=\"reference internal\" href=\"/it/6.0/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>Se fai override di questo metodo, alla fine devi restituire il valore dell’attributo. Dovresti anche aggiornare l’attributo del model se fai cambiamenti al valore, così che il codice che abbia riferimenti al model possa sempre vedere il valore corretto.</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>Specificare il form field per un model field<a class=\"heading-anchor\" href=\"#specifying-the-form-field-for-a-model-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Per personalizzare il campo del form usato da <a class=\"reference internal\" href=\"/it/6.0/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>, puoi fare override di <a class=\"reference internal\" href=\"/it/6.0/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>La classe del campo del form può essere specificata con gli argomenti <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">choices_form_class</span></code>; il secondo è usato se il campo specifica delle scelte, altrimenti il primo. Se questi argomenti non sono forniti, saranno usati <a class=\"reference internal\" href=\"/it/6.0/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> or <a class=\"reference internal\" href=\"/it/6.0/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>Tutto il dizionario <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> viene passato direttamente nel metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> del form. Normalmente, tutto quel che devi fare è impostare un buon default per l’argomento <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> (e magari <code class=\"docutils literal notranslate\"><span class=\"pre\">choices_form_class</span></code>). Questo ti potrebbe richiedere di scrivere un campo form personalizzato (ed anche un form widget). Vedi <a class=\"reference internal\" href=\"/it/6.0/topics/forms/\"><span class=\"doc\">documentazione dei form</span></a> per avere informazioni su questo.</p>\n<p>If you wish to exclude the field from the <a class=\"reference internal\" href=\"/it/6.0/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=\"/it/6.0/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 con il nostro esempio, possiamo scrivere il metodo <a class=\"reference internal\" href=\"/it/6.0/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> come:</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>Questo presume che abbiamo importato una classe per il campo <code class=\"docutils literal notranslate\"><span class=\"pre\">MyFormField</span></code> (che ha il proprio widget predefinito). Questo documento non copre i dettagli relativi alla scrittura di form field personalizzati.</p>\n</section>\n<section id=\"emulating-built-in-field-types\">\n<span id=\"id6\"></span><h4>Emulare tipi di campo built-in<a class=\"heading-anchor\" href=\"#emulating-built-in-field-types\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Se hai creato un metodo <a class=\"reference internal\" href=\"/it/6.0/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>, non devi preoccuparti del <a class=\"reference internal\" href=\"/it/6.0/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> – non verrà usato spesso. Qualche volta, però, lo storage del tuo database è di tipo simile a quello di qualche altro campo, quindi puoi usare la logica di quest’altro campo per creare la giusta colonna.</p>\n<p>Per esempio:</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>Non importa quale database stiamo usando per il backend, questo significa che <a class=\"reference internal\" href=\"/it/6.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> e altri comandi SQL creano il giusto tipo di colonna per il salvataggio di una stringa.</p>\n<p>Se <a class=\"reference internal\" href=\"/it/6.0/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> ritorna una stringa che non è nota a Django per il database di backend che stai utilizzando – cioè, non appare in <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends.&lt;db_name&gt;.base.DatabaseWrapper.data_types</span></code> – la stringa sarà ugualmente usata dal serializzatore, ma il metodo di default <a class=\"reference internal\" href=\"/it/6.0/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> ritornerà <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Vedi la documentazione di <a class=\"reference internal\" href=\"/it/6.0/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> per capire i motivi per cui questo potrebbe essere utile. Inserire una stringa descrittiva come tipo del campo per il serializzatore è una buona idea semmai dovessi usare l’output del serializzatore da qualche altra parte, al di fuori di Django.</p>\n</section>\n<section id=\"converting-field-data-for-serialization\">\n<span id=\"converting-model-field-to-serialization\"></span><h4>Conversione dei dati del campo per la serializzazione<a class=\"heading-anchor\" href=\"#converting-field-data-for-serialization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Per personalizzare il modo in cui i valori vengono serializzati da un serializzatore, puoi fare l’override di <a class=\"reference internal\" href=\"/it/6.0/ref/models/fields/#django.db.models.Field.value_to_string\" title=\"django.db.models.Field.value_to_string\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">value_to_string()</span></code></a>. Usare <a class=\"reference internal\" href=\"/it/6.0/ref/models/fields/#django.db.models.Field.value_from_object\" title=\"django.db.models.Field.value_from_object\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">value_from_object()</span></code></a> è il modo migliore di ottenere il valore del campo prima della serializzazione. Ad esempio, dato che <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> usa delle stringhe per il salvataggio dei dati, possiamo riutilizzare una parte del codice di conversione esistente.</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>Alcuni consigli generali<a class=\"heading-anchor\" href=\"#some-general-advice\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Scrivere un campo personalizzato può essere un processo complesso, in particolar modo se stai facendo delle conversioni complesse tra i tipi  di dati Python e il tuo database e i formati di serializzazione. Ecco alcuni suggerimenti per rendere le cose più semplici:</p>\n<ol class=\"arabic simple\">\n<li><p>Look at the existing Django fields (in\n<a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.0.x/django/db/models/fields/__init__.py\">django/db/models/fields/__init__.py</a>) for inspiration. Try to find\na field that’s similar to what you want and extend it a little bit,\ninstead of creating an entirely new field from scratch.</p></li>\n<li><p>Metti un metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> sulla classe che stai incapsulando come campo. Ci sono molti casi in cui il comportamento di default del campo è quello di chaimare <code class=\"docutils literal notranslate\"><span class=\"pre\">str()</span></code> sul valore. (Negli esempi in questo documento, value` potrebbe essere una istanza di <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code>, non un <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>). Così, se il tuo metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> converte automaticamente in stringa il tuo oggetto Python, puoi risparmiarti un sacco di lavoro.</p></li>\n</ol>\n</section>\n</section>\n<section id=\"writing-a-filefield-subclass\">\n<h2>Scrivere una sottoclasse  <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code><a class=\"heading-anchor\" href=\"#writing-a-filefield-subclass\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Oltre ai metodi sopra, i campi che hanno a che fare con i file hanno pochi altri requisiti speciali che è necessario prendere in considerazione. La maggior parte delle meccaniche fornite da <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code>, come il controllo dello storage e del ritiro su e dal database, possono rimanere inalterate, lasciando alle sottoclassi l’onere di supportare un determinato tipo di file.</p>\n<p>Django fornisce una classe <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code>, che viene utilizzata come proxy per accedere ai contenuti del file e compiere operazioni. A partire da questa si possono creare delle sottoclassi per personalizzare le modalità di accesso al file ed i metodi disponibili. Si tratta di <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.fields.files</span></code> ed il suo comportamento standard viene spiegato nella <a class=\"reference internal\" href=\"/it/6.0/ref/files/file/\"><span class=\"doc\">documentazione dei file</span></a>.</p>\n<p>Una volta creata una sottoclasse di File`, è necessario dire alla nuova sottoclasse di <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> di usarla. Per farlo, assegna la nuova sottoclasse <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> all’attributo speciale <code class=\"docutils literal notranslate\"><span class=\"pre\">attr_class</span></code> della sottoclasse <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code>.</p>\n<section id=\"a-few-suggestions\">\n<h3>Alcuni suggerimenti<a class=\"heading-anchor\" href=\"#a-few-suggestions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>In aggiunta ai dettagli precedentemente esposti, ci sono alcune linee guida che possono migliorare notevolmente l’efficienza e la leggibilità del codice del campo.</p>\n<ol class=\"arabic simple\">\n<li><p>The source for Django’s own <code class=\"docutils literal notranslate\"><span class=\"pre\">ImageField</span></code> (in\n<a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.0.x/django/db/models/fields/files.py\">django/db/models/fields/files.py</a>) is a great example of how to\nsubclass <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> to support a particular type of file, as it\nincorporates all of the techniques described above.</p></li>\n<li><p>Metti in cache i file quando possibile. Dal momento che i file potrebbero trovarsi su sistemi di storage remoti, ritirarli potrebbe costare tempo o addirittura denaro aggiuntivo, cosa che non è sempre necessaria. Una volta che un file è stato ritirato per ottenere dati relativi al suo contenuto, metti in cache quanti più dati possibile per ridurre il numero di volte che il file deve essere ritirato per chiamate susseguenti relative a quelle informazioni.</p></li>\n</ol>\n</section>\n</section>","rootId":"how-to-create-custom-model-fields","toc":[{"title":"Introduzione","anchor":"introduction","children":[{"title":"Il nostro oggetto di esempio","anchor":"our-example-object","children":[]}]},{"title":"Teoria di Background","anchor":"background-theory","children":[{"title":"Stoccaggio DB","anchor":"database-storage","children":[]},{"title":"Cosa fa una classe di campo?","anchor":"what-does-a-field-class-do","children":[]}]},{"title":"Scrivere una sottoclasse di campo","anchor":"writing-a-field-subclass","children":[{"title":"Scomposizione di un campo","anchor":"field-deconstruction","children":[]},{"title":"Attributi di campo che non interessano la definizione di colonne di database","anchor":"field-attributes-not-affecting-database-column-definition","children":[]},{"title":"Cambiare la classe base di un campo personalizzato","anchor":"changing-a-custom-field-s-base-class","children":[]},{"title":"Documentare il tuo campo personalizzato","anchor":"documenting-your-custom-field","children":[]},{"title":"Metodi utili","anchor":"useful-methods","children":[{"title":"Tipi di database personalizzati","anchor":"custom-database-types","children":[]},{"title":"Conversione di valori a oggetti Python","anchor":"converting-values-to-python-objects","children":[]},{"title":"Convertire oggetti Python in query di valori","anchor":"converting-python-objects-to-query-values","children":[]},{"title":"Convertire query values in valori di database","anchor":"converting-query-values-to-database-values","children":[]},{"title":"Pre elaborazione dei valori prima del salvataggio","anchor":"preprocessing-values-before-saving","children":[]},{"title":"Specificare il form field per un model field","anchor":"specifying-the-form-field-for-a-model-field","children":[]},{"title":"Emulare tipi di campo built-in","anchor":"emulating-built-in-field-types","children":[]},{"title":"Conversione dei dati del campo per la serializzazione","anchor":"converting-field-data-for-serialization","children":[]}]},{"title":"Alcuni consigli generali","anchor":"some-general-advice","children":[]}]},{"title":"Scrivere una sottoclasse  FileField","anchor":"writing-a-filefield-subclass","children":[{"title":"Alcuni suggerimenti","anchor":"a-few-suggestions","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/it/6.0/howto/"}],"prev":{"docname":"howto/legacy-databases","title":"Come integrare Django con un database legacy","url":"/it/6.0/howto/legacy-databases/"},"next":{"docname":"howto/writing-migrations","title":"Come creare migrazioni di database","url":"/it/6.0/howto/writing-migrations/"},"formats":{"html":"/it/6.0/howto/custom-model-fields/","markdown":"/it/6.0/howto/custom-model-fields.md","json":"/it/6.0/howto/custom-model-fields.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/howto/custom-model-fields.txt","official":"https://docs.djangoproject.com/it/6.0/howto/custom-model-fields/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}