{"title":"Come creare model field personalizzati","version":"4.0","locale":"it","docname":"howto/custom-model-fields","url":"/it/4.0/howto/custom-model-fields/","canonical":"https://djangodocs.dev/it/4.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/4.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/4.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/4.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>Creare campi personalizzati richiede un po” di attenzione ai dettagli. Per rendere le cose più facili, in questo documento useremo un esempio consistente: avvolgere un oggetto Python che rappresenta il mazzo di carte in una mano di <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Contract_bridge\">Bridge</a>. Non preoccuparti, non è necessario che tu sappia come giocare a Bridge per seguire questo esempio. Devi sono sapere che 52 carte sono ripartite ugualmente per quattro giocatori, che sono tradizionalmente chiamati <em>nord</em>, <em>est</em>, <em>sud</em> e <em>ovest</em>. La nostra classe è fatta più o meno 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\">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>, possiamo convertire i dati relativi alle carte in una stringa di 104 caratteri concatenando tutte le carte assieme in un ordine prestabilito – diciamo, prima tutte le carte <em>nord</em>, poi quelle <em>est</em>, <em>sud</em> e <em>ovest</em>. Così gli oggetti <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> possono essere salvati come testo o colonne per 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/4.0/ref/forms/fields/\"><span class=\"doc\">form fields</span></a>) sono sottoclassi di <a class=\"reference internal\" href=\"/it/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n\n    <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;A hand of cards (bridge style)&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;max_length&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">104</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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>La controparte dello scrivere il tuo metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> è scrivere il metodo <a class=\"reference internal\" href=\"/it/4.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 usato durante le <a class=\"reference internal\" href=\"/it/4.0/topics/migrations/\"><span class=\"doc\">dei model migrazioni</span></a> per dire a Django come prendere una istanza del tuo nuovo campo per ridurla ad una forma serializzata - in particolare, quale argomento passare ad <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> per ricrearla.</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/4.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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;max_length&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">104</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">deconstruct</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">deconstruct</span><span class=\"p\">()</span>\n        <span class=\"k\">del</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;max_length&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span>\n</code></pre></div>\n<p>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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CommaSepField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"s2\">&quot;Implements comma-separated storage of lists&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">separator</span><span class=\"o\">=</span><span class=\"s2\">&quot;,&quot;</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">separator</span> <span class=\"o\">=</span> <span class=\"n\">separator</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">deconstruct</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">deconstruct</span><span class=\"p\">()</span>\n        <span class=\"c1\"># Only include kwarg if it&#39;s not the default</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">separator</span> <span class=\"o\">!=</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"p\">:</span>\n            <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;separator&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">separator</span>\n        <span class=\"k\">return</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span>\n</code></pre></div>\n<p>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=\"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>\n    <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>\n    <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>\n    <span class=\"o\">...</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomTextField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Come discusso in <a class=\"reference internal\" href=\"/it/4.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/4.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/4.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/4.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/4.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/4.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/4.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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MytypeField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;mytype&#39;</span>\n</code></pre></div>\n<p>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/4.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=\"s1\">&#39;mysql&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;datetime&#39;</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;timestamp&#39;</span>\n</code></pre></div>\n<p>I metodi <a class=\"reference internal\" href=\"/it/4.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> e <a class=\"reference internal\" href=\"/it/4.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> sono chiamati da Django quando il framework costruisce gli statement <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code> per la tua applicazione – cioè, quando crei le tabelle la prima volta. I metodi vengono anche chiamati quando viene costruita una clausola <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> che include il model field – cioè, quando richiedi dei dati con i metodi QuerySet come <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> ed <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> ed hai il model field come argomento. Non sono chiamati in nessun’altra situazione, così si può permettere di eseguire codice un po” più complesso, come il controllo <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.settings_dict</span></code> dell’esempio citato sopra.</p>\n<p>Alcuni tipi di colonne di database accettano parametri, come <code class=\"docutils literal notranslate\"><span class=\"pre\">CHAR(25)</span></code>, dove il parametro <code class=\"docutils literal notranslate\"><span class=\"pre\">25</span></code> rappresenta la lunghezza massima della colonna. In casi come questi, c’è più flessibilità se il parametro è specificato nel modello piuttosto che essere codificato nel metodo <code class=\"docutils literal notranslate\"><span class=\"pre\">db_type()</span></code>. Per esempio, non avrebbe senso avere un <code class=\"docutils literal notranslate\"><span class=\"pre\">CharMaxlength25Field</span></code>, mostrato qui:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># This is a silly example of hard-coded parameters.</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CharMaxlength25Field</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;char(25)&#39;</span>\n\n<span class=\"c1\"># In the model:</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">my_field</span> <span class=\"o\">=</span> <span class=\"n\">CharMaxlength25Field</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>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=\"s1\">&#39;char(</span><span class=\"si\">%s</span><span class=\"s1\">)&#39;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_length</span>\n\n<span class=\"c1\"># In the model:</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">my_field</span> <span class=\"o\">=</span> <span class=\"n\">BetterCharField</span><span class=\"p\">(</span><span class=\"mi\">25</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>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/4.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/4.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=\"s1\">&#39;integer UNSIGNED AUTO_INCREMENT&#39;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">rel_db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;integer UNSIGNED&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"converting-values-to-python-objects\">\n<span id=\"id2\"></span><h4>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/4.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/4.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/4.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/4.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/4.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 salvando i dati come campo VARCHAR sul database, così dobbiamo essere in grado di processare stringhe e <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> in <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code>. In <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, abbiamo anche bisogno di gestire 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<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">hand_string</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;Takes a string of cards and splits into a full hand.&quot;&quot;&quot;</span>\n    <span class=\"n\">p1</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s1\">&#39;.</span><span class=\"si\">{26}</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">p2</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s1\">&#39;..&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">p2</span><span class=\"o\">.</span><span class=\"n\">findall</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">p1</span><span class=\"o\">.</span><span class=\"n\">findall</span><span class=\"p\">(</span><span class=\"n\">hand_string</span><span class=\"p\">)]</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"mi\">4</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Invalid input for a Hand instance&quot;</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">Hand</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">from_db_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">expression</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n        <span class=\"k\">return</span> <span class=\"n\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">to_python</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">Hand</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n\n        <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n\n        <span class=\"k\">return</span> <span class=\"n\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>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/4.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/4.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/4.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=\"s1\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">([</span><span class=\"s1\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">l</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">l</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">north</span><span class=\"p\">,</span>\n                <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">east</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">south</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">west</span><span class=\"p\">)])</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.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/4.0/topics/forms/\"><span class=\"doc\">documentazione dei form</span></a> per avere informazioni su questo.</p>\n<p>Continuando con il nostro esempio, possiamo scrivere il metodo <a class=\"reference internal\" href=\"/it/4.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\"># This is a fairly standard way to set up some defaults</span>\n        <span class=\"c1\"># while letting the caller override them.</span>\n        <span class=\"n\">defaults</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form_class&#39;</span><span class=\"p\">:</span> <span class=\"n\">MyFormField</span><span class=\"p\">}</span>\n        <span class=\"n\">defaults</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">formfield</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">defaults</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>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/4.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/4.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=\"s1\">&#39;CharField&#39;</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/4.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/4.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/4.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/4.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/4.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/4.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>Guarda i campi Django esistenti (in <code class=\"file docutils literal notranslate\"><span class=\"pre\">django/db/models/fields/__init__.py</span></code>) per prendere spunto. Cerca di trovare un campo che è simile a quello che vuoi ed estendilo un po”, invece di creare un campo interamente nuovo da zero.</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/4.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>I sorgenti della <code class=\"docutils literal notranslate\"><span class=\"pre\">ImageField</span></code> di Django (in <code class=\"docutils literal notranslate\"><span class=\"pre\">django/db/models/fields/files.py</span></code>) sono un ottimo esempio di come realizzare sottoclassi di <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> per supportare particolari tipi di file, poichè incorpora tutte le tecniche descritte in precedenza.</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":"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/4.0/howto/"}],"prev":{"docname":"howto/custom-management-commands","title":"Come creare comandi django-admin personalizzati","url":"/it/4.0/howto/custom-management-commands/"},"next":{"docname":"howto/custom-lookups","title":"Come scrivere lookup personalizzati","url":"/it/4.0/howto/custom-lookups/"},"formats":{"html":"/it/4.0/howto/custom-model-fields/","markdown":"/it/4.0/howto/custom-model-fields.md","json":"/it/4.0/howto/custom-model-fields.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/howto/custom-model-fields.txt","official":"https://docs.djangoproject.com/it/4.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","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}