{"title":"Γράφοντας δικά σας πεδία μοντέλων","version":"1.11","locale":"el","docname":"howto/custom-model-fields","url":"/el/1.11/howto/custom-model-fields/","canonical":"https://djangodocs.dev/el/1.11/howto/custom-model-fields/","summary":"Εισαγωγή Link to this heading # Το άρθρο μοντέλα εξηγεί πως να χρησιμοποιήσετε τις στάνταρντ κλάσεις πεδίων του Django – CharField , DateField κλπ. Στις…","html":"<h1>Γράφοντας δικά σας πεδία μοντέλων<a class=\"heading-anchor\" href=\"#writing-custom-model-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"introduction\">\n<h2>Εισαγωγή<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Το άρθρο <a class=\"reference internal\" href=\"/el/1.11/topics/db/models/\"><span class=\"doc\">μοντέλα</span></a> εξηγεί πως να χρησιμοποιήσετε τις στάνταρντ κλάσεις πεδίων του Django – <a class=\"reference internal\" href=\"/el/1.11/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=\"/el/1.11/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> κλπ. Στις περισσότερες περιπτώσεις αυτές οι κλάσεις θα σας είναι αρκετές. Ωστόσο, η έκδοση του Django που χρησιμοποιείτε ίσως να μην καλύπτει τις ανάγκες και τις απαιτήσεις σας ή θα θέλατε να χρησιμοποιήσετε ένα πεδίο μοντέλου το οποίο είναι εντελώς διαφορετικό από αυτά που έρχονται με το Django.</p>\n<p>Οι τύποι των προεγκατεστημένων πεδίων του Django δεν καλύπτουν όλους τους πιθανούς τύπους στηλών μιας βάσης δεδομένων (υπόψιν ότι μερικές βάσεις έχουν αποκλειστικά δικούς τους τύπους στηλών που δεν βρίσκονται σε κάποια άλλη βάση) – μόνο τους βασικούς τύπους, όπως <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">INTEGER</span></code>. Για περισσότερους τύπους στηλών, όπως γεωγραφικά πολύγονα ή ακόμη και τύπους που μπορεί να δημιουργήσει ο χρήστης όπως οι <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/static/sql-createtype.html\">PostgreSQL custom types</a>, μπορείτε να ορίσετε τις δικές σας Django <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> subclasses.</p>\n<p>Εναλλακτικά, μπορείτε να έχετε ένα πολύπλοκο Python object το οποίο να μπορεί κάπως να γίνει serialized για να μπορέσει να αναπαρασταθεί ως στάνταρντ στήλη στη βάση δεδομένων. Αυτή είναι μια άλλη περίπτωση όπου μια subclass της <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> θα σας βοηθήσει να χρησιμοποιήσετε το object σας με τα μοντέλα σας.</p>\n<section id=\"our-example-object\">\n<h3>Το object του παραδείγματος μας<a class=\"heading-anchor\" href=\"#our-example-object\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Η δημιουργία δικών μας παραμετροποιήσιμων πεδίων απαιτεί προσοχή στη λεπτομέρεια. Για να κάνουμε τα πράγματα πιο εύκολα, θα χρησιμοποιήσουμε το ίδιο παράδειγμα σε όλο αυτό το άρθρο: θα δημιουργήσουμε ένα Python object που θα αναπαριστά το μοίρασμα των χαρτιών σε μια παρτίδα <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Contract_bridge\">Bridge</a>. Μην ανησυχείτε, όμως, δεν χρειάζεται να γνωρίζετε πως παίζεται το Bridge για να καταλάβετε αυτό το παράδειγμα. Το μόνο που χρειάζεται να ξέρετε είναι ότι απαιτούνται 52 χαρτιά να μοιραστούν ισομερώς σε τέσσερις παίκτες, οι οποίοι ονομάζονται, παραδοσιακά, <em>north</em>, <em>east</em>, <em>south</em> και <em>west</em>. Η κλάση μας θα μοιάζει κάπως έτσι:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Hand</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;A hand of cards (bridge style)&quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">north</span><span class=\"p\">,</span> <span class=\"n\">east</span><span class=\"p\">,</span> <span class=\"n\">south</span><span class=\"p\">,</span> <span class=\"n\">west</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Input parameters are lists of cards (&#39;Ah&#39;, &#39;9s&#39;, etc.)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">north</span> <span class=\"o\">=</span> <span class=\"n\">north</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">east</span> <span class=\"o\">=</span> <span class=\"n\">east</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">south</span> <span class=\"o\">=</span> <span class=\"n\">south</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">west</span> <span class=\"o\">=</span> <span class=\"n\">west</span>\n\n    <span class=\"c1\"># ... (other possibly useful methods omitted) ...</span>\n</code></pre></div>\n<p>Η κλάση που γράψαμε δεν είναι τίποτε άλλο παρά μια συνηθισμένη κλάση Python, χωρίς να την συνδέει κάτι με το Django. Θα θέλαμε να κάνουμε πράγματα, όπως αυτό, στα Django μοντέλα μας (υποθέτουμε ότι το attribute <code class=\"docutils literal notranslate\"><span class=\"pre\">hand</span></code> του μοντέλου είναι ένα instance της κλάσης <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>Εκχωρούμε στο και ανακτούμε από το attribute <code class=\"docutils literal notranslate\"><span class=\"pre\">hand</span></code> του μοντέλου μας όπως ακριβώς θα κάναμε με κάθε άλλη κλάση της Python. Το κόλπο είναι να πούμε στο Django πως να διαχειριστεί την αποθήκευση στην και τη φόρτωση από τη βάση δεδομένων αυτού του object.</p>\n<p>Για να χρησιμοποιήσουμε την κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> στα μοντέλα μας, <strong>δεν χρειάζεται</strong> να αλλάξουμε αυτή την κλάση καθόλου. Αυτό είναι ιδανικό, καθώς σημαίνει ότι μπορείτε να γράψετε Django μοντέλα για ήδη υπάρχουσες κλάσεις χωρίς να χρειαστεί να πειράξετε τον πηγαίο κώδικα.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>Ίσως να θέλετε, μόνο, να επωφεληθείτε από τους δικούς σας τύπους στηλών στη βάση δεδομένων και να διαχειριστείτε τα δεδομένα σας ως στάνταρντ τύπους Python objects στα μοντέλα σας, πχ strings, floats κλπ. Αυτή η περίπτωση είναι παρόμοια με το παράδειγμα μας, <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code>, όπου θα υποδεικνύουμε τυχόν διαφορές καθώς προχωράμε.</p>\n</aside>\n</section>\n</section>\n<section id=\"background-theory\">\n<h2>Βασική θεωρία<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>Αποθηκευτικός χώρος στη βάση δεδομένων<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>Ο πιο απλός τρόπος για να σκεφτείτε έναν τύπο μοντέλου (model field) είναι ότι προσφέρει έναν τρόπο ενός συνηθισμένου Python object – string, boolean, <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>, ή κάτι πιο περίπλοκο όπως το <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> – να μετατραπεί σε και από μια μορφή η οποία είναι χρήσιμη όταν επικοινωνούμε με τη βάση δεδομένων (και με το serialization, αλλά, όπως θα δούμε αργότερα, αυτό δεν θα σας απασχολήσει όταν έχετε τακτοποιήσει τη βάση).</p>\n<p>Τα πεδία σε ένα μοντέλο πρέπει με κάποιο τρόπο να μετατραπούν ούτως ώστε να μπορέσει να τα δεχτεί ο αντίστοιχος τύπος στήλης της βάσης δεδομένων. Διαφορετικές βάσεις δεδομένων προσφέρουν διαφορετικά σετ από έγκυρους τύπους στηλών, αλλά ο κανόνας είναι ο ίδιος: αυτοί είναι οι μοναδικοί τύποι με τους οποίους θα μπορείτε να δουλεύετε. Οτιδήποτε θέλετε να αποθηκεύσετε στη βάση δεδομένων, πρέπει να προσαρμοστεί σε έναν από αυτούς τους τύπους.</p>\n<p>Συνήθως, είτε θα γράφετε ένα πεδίο Django για να ταιριάζει με έναν συγκεκριμένο τύπο στήλης της βάσης είτε θα μετατρέπετε σε μορφή string, με κάποιον τρόπο, τα δεδομένα προς αποθήκευση στη βάση.</p>\n<p>Για το δικό μας παράδειγμα <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code>, θα μπορούσαμε να μετατρέψουμε τα δεδομένα των χαρτιών της τράπουλας σε ένα string 104 χαρακτήρων ενώνοντας (concatenating) όλα τα χαρτιά μεταξύ τους σε μια προκαθορισμένη σειρά – πχ, όλα τα <em>north</em> χαρτιά πρώτα, μετά τα <em>east</em>, μετά τα <em>south</em> και τέλος τα <em>west</em>. Επομένως, τα objects τύπου <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> θα μπορούσαν να αποθηκευτούν ως στήλη κειμένου (text) ή ως στήλη χαρακτήρων (character) στη βάση δεδομένων. Για άλλη μια φορά, επειδή η βάση δεν καταλαβαίνει την γλώσσα Python, θα πρέπει να μετατρέψουμε τα δεδομένα μας σε κάποια μορφή που η βάση καταλαβαίνει. Αντίστροφα, όταν αντλούμε δεδομένα από τη βάση, θα πρέπει να τα μετατρέψουμε σε Python objects για να τα διαχειριστούμε, ανάλογα τις ανάγκες μας.</p>\n</section>\n<section id=\"what-does-a-field-class-do\">\n<h3>Τι κάνει μια κλάση τύπου Field;<a class=\"heading-anchor\" href=\"#what-does-a-field-class-do\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Όλα τα πεδία του Django (και όταν λέμε <em>πεδία</em> σε αυτό το άρθρο, εννοούμε πάντα πεδία μοντέλων και όχι <a class=\"reference internal\" href=\"/el/1.11/ref/forms/fields/\"><span class=\"doc\">πεδία φορμών</span></a>) είναι subclasses της κλάσης <a class=\"reference internal\" href=\"/el/1.11/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>. Οι περισσότερες πληροφορίες που καταγράφει το Django σχετικά με ένα πεδίο είναι κοινές για όλα τα πεδία – όνομα, βοηθητικό κείμενο, μοναδικότητα κοκ. Η αποθήκευση όλων αυτών των πληροφοριών γίνεται από την κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>. Θα πούμε με λεπτομέρειες τι μπορεί να κάνει η <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> σε λίγο. Για τώρα, αρκεί να πούμε ότι όλα τα πεδία κληρονομούν από την κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> και παραμετροποιούν διάφορα βασικά κομμάτια της συμπεριφοράς της.</p>\n<p>Είναι σημαντικό να συνειδητοποιήσετε ότι η κλάση ενός πεδίου του Django (πχ <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">BooleanField</span></code> κλπ) δεν αποθηκεύεται στα attributes των μοντέλων σας. Τα attributes του μοντέλου περιέχουν συνηθισμένα Python objects. Η κλάσεις των πεδίων που ορίζετε σε ένα μοντέλο αποθηκεύονται στην ουσία σε μια <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> κλάση όταν δημιουργείται το μοντέλο (οι ακριβείς λεπτομέρειες του πως γίνεται αυτό, δεν έχουν σημασία τώρα). Αυτό γίνεται επειδή οι κλάσεις των πεδίων δεν είναι απαραίτητες όταν απλώς δημιουργείτε και αλλάζετε τα attributes. Αντ’ αυτού οι κλάσεις προσφέρουν τον μηχανισμό για την μετατροπή μεταξύ του attribute και αυτού που είναι αποθηκευμένο στη βάση δεδομένων ή για την αποστολή στον <a class=\"reference internal\" href=\"/el/1.11/topics/serialization/\"><span class=\"doc\">serializer</span></a>.</p>\n<p>Κρατήστε στο μυαλό σας τα ακόλουθα, όταν δημιουργείτε δικά σας πεδία. Η subclass <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> του Django που γράφετε, σας προσφέρει έναν μηχανισμό μετατροπής μεταξύ Python instances και τιμών database/serializer με διάφορους τρόπους (πχ, υπάρχουν διαφορές μεταξύ της αποθήκευσης της τιμής και της χρησιμοποίησης της στα lookups). Αν αυτό ακούγεται κάπως περίπλοκο, μην ανησυχείτε – θα γίνει κατανοητό στα παραδείγματα παρακάτω. Να θυμάστε, μόνο, ότι συχνά θα καταλήγετε με τη δημιουργία δύο κλάσεων, όταν γράφετε δικά σας πεδία:</p>\n<ul class=\"simple\">\n<li><p>Η πρώτη κλάση θα είναι το Python object που θα χρησιμοποιούν οι χρήστες. Θα το αναθέσουν σε ένα attribute του μοντέλου, θα διαβάζουν από αυτό για να βλέπουν τα δεδομένα που αντιστοιχούν σε αυτό, θα αποθηκεύουν δεδομένα μέσω αυτού κλπ. Αυτή η κλάση είναι η <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> στο παράδειγμα μας.</p></li>\n<li><p>Η δεύτερη κλάση θα είναι μια subclass της <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>. Αυτή είναι μια κλάση η οποία ξέρει πως να μετατρέψει την πρώτη σας κλάση σε δεδομένα που καταλαβαίνει η βάση δεδομένων και αντίστροφα τα δεδομένα που είναι αποθηκευμένα στη βάση δεδομένων σε object που καταλαβαίνει η Python.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"writing-a-field-subclass\">\n<h2>Γράφοντας μια subclass ενός πεδίου<a class=\"heading-anchor\" href=\"#writing-a-field-subclass\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Όταν σχεδιάζετε τη subclass της κλάσης <a class=\"reference internal\" href=\"/el/1.11/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> (το δικό σας νέο πεδίο, αν θέλετε), θα πρέπει πρώτα να σκεφτείτε με ποια από τις ήδη υπάρχουσες κλάσεις <a class=\"reference internal\" href=\"/el/1.11/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 ένα ήδη υπάρχον Django πεδίο και να γλυτώσετε τον εαυτό σας πολύτιμο χρόνο. Αν όχι, θα πρέπει να κάνετε subclass την κλάση <a class=\"reference internal\" href=\"/el/1.11/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<p>Η αρχικοποίηση (initialization) του νέου σας πεδίου έχει να κάνει με τον διαχωρισμό των arguments που είναι συγκεκριμένα για αυτό που θέλετε να κάνει το πεδίο σας και των συνηθισμένων arguments. Στην μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> της κλάσης <a class=\"reference internal\" href=\"/el/1.11/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> (ή στην parent κλάση) περνάτε τα arguments που είναι συγκεκριμένα για το πεδίο σας.</p>\n<p>Στο παράδειγμα μας, θα ονομάσουμε το πεδίο μας <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>. (Είναι, γενικά, καλή πρακτική να καλείτε τη subclass της <a class=\"reference internal\" href=\"/el/1.11/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>, ούτως ώστε να εύκολα αναγνωρίσιμη ως μια subclass της <a class=\"reference internal\" href=\"/el/1.11/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\">HandField</span></code> δεν συμπεριφέρεται ως ένα ήδη υπάρχον Django πεδίο (πχ <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> ή <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code>), οπότε θα κάνουμε subclass απ’ ευθείας από την <a class=\"reference internal\" href=\"/el/1.11/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n\n    <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;A hand of cards (bridge style)&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;max_length&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">104</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">HandField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Η <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> δέχεται τις περισσότερες από τις στάνταρντ επιλογές πεδίων (δείτε τη λίστα παρακάτω), αλλά εδώ εξασφαλίζουμε ότι έχει ένα συγκεκριμένο μέγιστο μήκος, αφού το μέγιστο που χρειάζεται είναι 52 τιμές φύλλων μαζί με το χρώμα του καθενός, πχ άσσος μπαστούνι (As, ace of spades) ή τρία κούπα (3h, 3 of hearts) κλπ: 104 χαρακτήρες στο σύνολο.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>Πολλά από τα πεδία των μοντέλων του Django δέχονται μερικές επιλογές με τις οποίες δεν κάνουν τίποτα, απλώς τις αγνοούν. Για παράδειγμα, μπορείτε να περάσετε την παράμετρο <a class=\"reference internal\" href=\"/el/1.11/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> και την  <a class=\"reference internal\" href=\"/el/1.11/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> σε μια κλάση τύπου <a class=\"reference internal\" href=\"/el/1.11/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> και η παράμετρος <a class=\"reference internal\" href=\"/el/1.11/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> απλά θα αγνοηθεί (όταν το <a class=\"reference internal\" href=\"/el/1.11/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> είναι <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> προϋποθέτει ότι <code class=\"docutils literal notranslate\"><span class=\"pre\">editable=False</span></code>). Κανένα σφάλμα δεν θα γίνει raised σε αυτή την περίπτωση.</p>\n<p>Αυτή η συμπεριφορά απλοποιεί τις κλάσεις των πεδίων επειδή δεν χρειάζεται να ελέγχουν για επιλογές (παραμέτρους) οι οποίες δεν είναι απαραίτητες. Απλώς, περνούν όλες τις επιλογές στην parent class και στη συνέχεια δεν τις χρησιμοποιούν. Από σας εξαρτάται αν θέλετε τα πεδία σας να είναι αυστηρά (strict) σε σχέση με τις παραμέτρους που επιλέγουν, ή να είναι πιο απλά, δηλαδή να δέχονται περισσότερες επιλογές.</p>\n</aside>\n<p>Η μέθοδος <code class=\"docutils literal notranslate\"><span class=\"pre\">Field.__init__()</span></code> δέχεται τις ακόλουθες παραμέτρους:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/el/1.11/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=\"/el/1.11/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=\"/el/1.11/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=\"/el/1.11/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=\"/el/1.11/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=\"/el/1.11/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=\"/el/1.11/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>: Χρησιμοποιείται για συσχετισμένα πεδία (όπως το <a class=\"reference internal\" href=\"/el/1.11/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>). Για προχωρημένους χρήστες μόνο.</p></li>\n<li><p><a class=\"reference internal\" href=\"/el/1.11/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=\"/el/1.11/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>: Αν είναι <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, το πεδίο δεν θα γίνει serialized όταν το μοντέλο περάσει στους <a class=\"reference internal\" href=\"/el/1.11/topics/serialization/\"><span class=\"doc\">serializers</span></a> του Django. Η προεπιλεγμένη τιμή είναι <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/el/1.11/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=\"/el/1.11/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=\"/el/1.11/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=\"/el/1.11/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=\"/el/1.11/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=\"/el/1.11/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=\"/el/1.11/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>: Μόνο για τη δημιουργία περιεχομένων (indexes), αν η βάση δεδομένων υποστηρίζει τα <a class=\"reference internal\" href=\"/el/1.11/topics/db/tablespaces/\"><span class=\"doc\">tablespaces</span></a>. Τις πιο πολλές φορές, μπορείτε να αγνοείτε αυτή την επιλογή.</p></li>\n<li><p><a class=\"reference internal\" href=\"/el/1.11/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> αν το πεδίο δημιουργήθηκε αυτόματα, όπως το <a class=\"reference internal\" href=\"/el/1.11/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> που χρησιμοποιείται από την κληρονομικότητα των μοντέλων. Για προχωρημένους χρήστες μόνο.</p></li>\n</ul>\n<p>Όλες οι επιλογές χωρίς εξήγηση, στην ανωτέρω λίστα, έχουν την ίδια έννοια με τα συνηθισμένα πεδία του Django. Δείτε στο άρθρο <a class=\"reference internal\" href=\"/el/1.11/ref/models/fields/\"><span class=\"doc\">εγχειρίδιο πεδίων των μοντέλων</span></a> για παραδείγματα και λεπτομέρειες.</p>\n<section id=\"field-deconstruction\">\n<span id=\"custom-field-deconstruct-method\"></span><h3>Deconstruction του πεδίου<a class=\"heading-anchor\" href=\"#field-deconstruction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Όταν υλοποιείτε τη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> θα πρέπει να υλοποιήσετε και τη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code>. Αυτή η μέθοδος λέει στο Django πως να μετατρέψει το instance του καινούργιου σας πεδίου σε μια σειριακή μορφή (serialized form) - πιο συγκεκριμένα, ποια arguments θα πρέπει να περαστούν στη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> για να ξαναφτιαχτεί το instance.</p>\n<p>Αν δεν έχετε προσθέσει τυχόν έξτρα επιλογές στη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> του δικού σας πεδίου, δεν χρειάζεται να γράψετε κάποια νέα μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code>. Αν, ωστόσο, αλλάξετε τα arguments που περνούν στην <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> (όπως κάναμε στην κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> που αλλάξαμε το <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs['max_length']</span></code>), θα χρειαστεί να προσθέσετε τις τιμές που περάσατε.</p>\n<p>Το συμβόλαιο με την μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> είναι απλό. Επιστρέφει ένα tuple τεσσάρων στοιχείων: το όνομα του attribute του field, το πλήρες import path της κλάσης του πεδίου, τα positional arguments (ως λίστα) και τα keyword arguments (ως dictionary). Σημειώστε ότι αυτή η μέθοδος είναι διαφορετική από τη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> <a class=\"reference internal\" href=\"/el/1.11/topics/migrations/#custom-deconstruct-method\"><span class=\"std std-ref\">όταν γράφεται δικές σας κλάσεις</span></a> η οποία επιστρέφει ένα tuple τριών στοιχείων.</p>\n<p>Ως συντάκτης του δικού σας πεδίου, δεν θα σας απασχολήσουν τα δύο πρώτα στοιχεία του tuple. Η κύρια κλάση της <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> έχει όλο τον απαραίτητο κώδικα για να υπολογίσει το όνομα και το import path του πεδίου σας. Ωστόσο, σίγουρα θα σας απασχολήσουν τα positional και keyword arguments, αφού αυτά είναι τα στοιχεία που πιθανόν να αλλάξετε.</p>\n<p>Για παράδειγμα, στην κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> θέτουμε το <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> μέσα στην <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code>. Η μέθοδος <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> της κλάσης <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> (την οποία καλούμε - <code class=\"docutils literal notranslate\"><span class=\"pre\">super(HandField,</span> <span class=\"pre\">self).deconstruct()</span></code>) θα δει ότι έχει οριστεί το <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> και θα το επιστρέψει μέσα στο <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> dictionary. Για λόγους αναγνωσιμότητας μπορούμε να το διαγράψουμε από το dictionary και έτσι το <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> να είναι κενό. Όταν, επομένως, πάρουμε αυτό το tuple των τεσσάρων στοιχείων και προσπαθήσουμε να χτίσουμε ένα instance του <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> δεν έχει πολύ νόημα το <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> να περιέχει το <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> αφού κατά το χτίσιμο του instance θα κληθεί η <code class=\"docutils literal notranslate\"><span class=\"pre\">__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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;max_length&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">104</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">HandField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">deconstruct</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">HandField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">deconstruct</span><span class=\"p\">()</span>\n        <span class=\"k\">del</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;max_length&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span>\n</code></pre></div>\n<p>Αν προσθέσετε ένα νέο keyword argument, θα χρειαστεί να γράψετε κώδικα για να προσθέσετε την τιμή του στο <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</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\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CommaSepField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"s2\">&quot;Implements comma-separated storage of lists&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">separator</span><span class=\"o\">=</span><span class=\"s2\">&quot;,&quot;</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">separator</span> <span class=\"o\">=</span> <span class=\"n\">separator</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">CommaSepField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">deconstruct</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">CommaSepField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">deconstruct</span><span class=\"p\">()</span>\n        <span class=\"c1\"># Only include kwarg if it&#39;s not the default</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">separator</span> <span class=\"o\">!=</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"p\">:</span>\n            <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;separator&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">separator</span>\n        <span class=\"k\">return</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span>\n</code></pre></div>\n<p>Πιο περίπλοκα παραδείγματα είναι πέρα από τους σκοπούς αυτού του άρθρου, αλλά να θυμάστε – για κάθε παραμετροποίηση του instance του Field, η μέθοδος <code class=\"docutils literal notranslate\"><span class=\"pre\">deconstruct()</span></code> πρέπει να επιστρέφει arguments τα οποία αν περάσετε στην <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> θα ξαναφτιάξετε το πεδίο σας.</p>\n<p>Δώστε μεγάλη προσοχή στην περίπτωση που δώσετε τυχόν νέες προεπιλεγμένες τιμές στα arguments της superclass της <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code>. Πρέπει να εξασφαλίσετε ότι πάντοτε περιλαμβάνονται παρά εξαφανίζονται όταν λαμβάνουν την παλιά προεπιλεγμένη τιμή.</p>\n<p>Επιπροσθέτως, προσπαθήστε να αποφύγετε να περάσετε τιμές ως positional arguments, όπου δυνατόν και αντί αυτού να επιστρέφετε τις τιμές ως keyword arguments για περισσότερη συμβατότητα στο μέλλον. Φυσικά, αν αλλάζετε τα ονόματα πιο συχνά από τη θέση τους στη λίστα των arguments του constructor, ίσως να προτιμήσετε τα positional arguments, αλλά έχετε στο μυαλό σας ότι άλλοι προγραμματιστές θα κάνουν reconstruct το πεδίο σας από την σειριακή έκδοση του για αρκετό καιρό (πιθανόν χρόνια), αναλόγως το χρόνο ζωής των migration σας.</p>\n<p>Μπορείτε να δείτε τα αποτελέσματα του deconstruction κοιτάζοντας τα migrations τα οποία περιέχουν το πεδίο και μπορείτε, επίσης, να τεστάρετε το deconstruction σε unit tests απλώς κάνοντας deconstruct και reconstruct το πεδίο:</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>Αλλάζοντας την base class του δικού σας πεδίου<a class=\"heading-anchor\" href=\"#changing-a-custom-field-s-base-class\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Δεν μπορείτε να αλλάξετε την base class ενός παραμετροποιήσιμου πεδίου επειδή το Django δεν ανιχνεύει την αλλαγή και δεν θα δημιουργήσει migration για αυτή την αλλαγή. Για παράδειγμα αν ξεκινήσετε με αυτό:</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>και μετά αποφασίσετε ότι θέλετε να χρησιμοποιήσετε αντί αυτού ένα <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code>, δεν μπορείτε να αλλάξετε την subclass όπως:</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>Αντιθέτως, πρέπει να δημιουργήσετε μια νέα κλάση πεδίου και να ενημερώσετε τα μοντέλα σας για να αναφερθούν σε αυτό:</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>Όπως συζητήθηκε στο <a class=\"reference internal\" href=\"/el/1.11/topics/migrations/#migrations-removing-model-fields\"><span class=\"std std-ref\">αφαιρώντας πεδία μοντέλων</span></a>, θα πρέπει να διατηρήσετε την αρχική κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">CustomCharField</span></code> στον κώδικα σας όσο έχετε migrations τα οποία αναφέρονται σε αυτή.</p>\n</section>\n<section id=\"documenting-your-custom-field\">\n<h3>Τεκμηριώνοντας το δικό σας πεδίο<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>Όπως πάντα, θα πρέπει να τεκμηριώνετε (περιγραφικά και βοηθητικά σχόλια) τον τύπο του πεδίου σας, προκειμένου οι χρήστες αυτού να γνωρίζουν περί τίνος πρόκειται. Πέρα από το γεγονός του να γράψετε ένα docstring για αυτό, το οποίο είναι χρήσιμο για τους developers, μπορείτε επίσης να προσφέρετε στους χρήστες του Django admin να δουν μια μικρή περιγραφή του τύπου του πεδίου μέσω της εφαρμογής <a class=\"reference internal\" href=\"/el/1.11/ref/contrib/admin/admindocs/\"><span class=\"doc\">django.contrib.admindocs</span></a>. Για να γίνει αυτό απλώς προσθέστε ένα περιγραφικό κείμενο στο class attribute <a class=\"reference internal\" href=\"/el/1.11/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> του δικού σας πεδίου. Στο παραπάνω παράδειγμα, η περιγραφή που εμφανίζεται από την εφαρμογή <code class=\"docutils literal notranslate\"><span class=\"pre\">admindocs</span></code> για το πεδίο <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> θα είναι η “A hand of cards (bridge style)”.</p>\n<p>Στην εμφάνιση του module <a class=\"reference internal\" href=\"/el/1.11/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>, η περιγραφή του πεδίου ενσωματώνεται στο <code class=\"docutils literal notranslate\"><span class=\"pre\">field.__dict__</span></code> το οποίο επιτρέπει στην περιγραφή να συνεργαστεί με arguments του πεδίου. Για παράδειγμα, η περιγραφή του <a class=\"reference internal\" href=\"/el/1.11/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>Χρήσιμες μέθοδοι<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>Όταν φτιάξετε την subclass της κλάσης <a class=\"reference internal\" href=\"/el/1.11/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>, μπορείτε, αν θέλετε, να παρακάμψετε (override) μερικές στάνταρντ μεθόδους, ανάλογα τη συμπεριφορά του πεδίου σας. Η λίστα με τις μεθόδους, παρακάτω, είναι περίπου κατά φθίνουσα σειρά σπουδαιότητας, οπότε ξεκινήστε από πάνω προς τα κάτω.</p>\n<section id=\"custom-database-types\">\n<span id=\"id1\"></span><h4>Δικά σας πεδία βάσης δεδομένων<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>Ας υποθέσουμς ότι έχετε δημιουργήσει ένα δικό σας πεδίο στη PostgreSQL με το όνομα <code class=\"docutils literal notranslate\"><span class=\"pre\">mytype</span></code>. Μπορείτε να κάνετε subclass τη κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> και να υλοποιήσετε τη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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>, ως εξής:</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>Όταν θα έχετε γράψει το <code class=\"docutils literal notranslate\"><span class=\"pre\">MytypeField</span></code>, μπορείτε να το χρησιμοποιήσετε σε οποιοδήποτε από τα μοντέλα σας, όπως ακριβώς με οποιοδήποτε άλλο τύπο <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>Αν σκοπεύετε να φτιάξετε μια εφαρμογή η οποία είναι ανεξάρτητη από τη βάση δεδομένων που χρησιμοποιείται, θα πρέπει να λάβετε υπόψη σας τις διαφορές τύπων στηλών μεταξύ των βάσεων δεδομένων. Για παράδειγμα, η στήλη τύπου date/time στην PostgreSQL καλείτε <code class=\"docutils literal notranslate\"><span class=\"pre\">timestamp</span></code>, ενώ η ίδια στήλη στη MySQL καλείται <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>. Ο πιο απλός τρόπος να χειριστείτε αυτή την κατάσταση μέσα στη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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> είναι να ελέγξετε το attribute <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.settings_dict['ENGINE']</span></code>.</p>\n<p>Για παράδειγμα:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyDateField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">settings_dict</span><span class=\"p\">[</span><span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;django.db.backends.mysql&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;datetime&#39;</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;timestamp&#39;</span>\n</code></pre></div>\n<p>Οι μέθοδοι <a class=\"reference internal\" href=\"/el/1.11/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> και <a class=\"reference internal\" href=\"/el/1.11/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> καλούνται από το Django όταν το framework φτιάχνει τα <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code> statements για την εφαρμογή σας – δηλαδή, στο αρχικό στάδιο δημιουργίας των πινάκων σας. Οι μέθοδοι, καλούνται, επίσης, όταν δημιουργείται μια <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> εντολή η οποία περιλαμβάνει το πεδίο του μοντέλου – δηλαδή, όταν αντλείτε δεδομένα χρησιμοποιώντας μεθόδους QuerySet όπως η <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code> και έχετε περασμένο το πεδίο του μοντέλου ως argument. Οι μέθοδοι αυτές δεν καλούνται κάποια άλλη στιγμή, οπότε αξίζει να εκτελέσουν έναν ελαφρά περίπλοκο κώδικα, όπως το να ελέγξουν το <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.settings_dict</span></code> όπως στο παραπάνω παράδειγμα.</p>\n<p>Μερικοί τύποι στηλών βάσης δεδομένων δέχονται παραμέτρους, όπως <code class=\"docutils literal notranslate\"><span class=\"pre\">CHAR(25)</span></code>, όπου η παράμετρος <code class=\"docutils literal notranslate\"><span class=\"pre\">25</span></code> αναπαριστά το μέγιστο μήκος χαρακτήρων της στήλης. Σε παρόμοιες περιπτώσεις, είναι πιο ευέλικτο η παράμετρος να δηλωθεί στο μοντέλο (ως <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> attribute) παρά να γραφεί με το χέρι μέσα στη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">db_type()</span></code>. Για παράδειγμα, δεν θα είχε πολύ νόημα να είχατε ένα πεδίο <code class=\"docutils literal notranslate\"><span class=\"pre\">CharMaxlength25Field</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 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>Ένας καλύτερος τρόπος είναι να προσδιορίσετε την παράμετρο κατά τη διάρκεια του run time – πχ, όταν η κλάση αρχικοποιείται. Για να το κάνετε αυτό, απλώς υλοποιήστε την <code class=\"docutils literal notranslate\"><span class=\"pre\">Field.__init__()</span></code>, ως εξής (εδώ περνάμε την παράμετρο max_length ως positional argument):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># This is a much more flexible example.</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BetterCharField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">max_length</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_length</span> <span class=\"o\">=</span> <span class=\"n\">max_length</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">BetterCharField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;char(</span><span class=\"si\">%s</span><span class=\"s1\">)&#39;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_length</span>\n\n<span class=\"c1\"># In the model:</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">my_field</span> <span class=\"o\">=</span> <span class=\"n\">BetterCharField</span><span class=\"p\">(</span><span class=\"mi\">25</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Εν τέλει, αν η στήλη σας απαιτεί πραγματικά περίπλοκο SQL στήσιμο, επιστρέψτε <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> από την μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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>. Αυτό θα επιτρέψει στον κώδικα του Django που παράγει την SQL να προσπεράσει αυτό το πεδίο. Είστε, πλέον, υπεύθυνοι να δημιουργήσετε εσείς τη στήλη στο σωστό πίνακα με κάποιον άλλο τρόπο. Αυτό, φυσικά, λέει στο Django να βγει από τη μέση.</p>\n<p>Η μέθοδος <a class=\"reference internal\" href=\"/el/1.11/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> καλείται από πεδία τύπου <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code> τα οποία δείχνουν σε ένα άλλο πεδίο για να καθορίσουν τον τύπο δεδομένων της στήλης. Για παράδειγμα, αν έχετε ένα πεδίο τύπου <code class=\"docutils literal notranslate\"><span class=\"pre\">UnsignedAutoField</span></code>, χρειάζεστε επίσης τα foreign keys τα οποία δείχνουν σε αυτό το πεδίο για να χρησιμοποιηθεί ο ίδιος τύπος δεδομένων:</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<aside class=\"version-note version-added\" data-version=\"1.10\">\n<p class=\"version-note-title\">New in Django 1.10</p><p>Προστέθηκε η μέθοδος <a class=\"reference internal\" href=\"/el/1.11/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>.</p>\n</aside>\n</section>\n<section id=\"converting-values-to-python-objects\">\n<span id=\"id2\"></span><h4>Μετατρέποντας τιμές σε Python objects<a class=\"heading-anchor\" href=\"#converting-values-to-python-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Αν η δικιά σας κλάση <a class=\"reference internal\" href=\"/el/1.11/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> ασχολείται με δομές δεδομένων (data structures) οι οποίες είναι πιο περίπλοκες από strings, dates, integers, ή floats, τότε ίσως χρειαστεί να παρακάμψετε (override) τις μέθοδους <a class=\"reference internal\" href=\"/el/1.11/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> και <a class=\"reference internal\" href=\"/el/1.11/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>Αν η μέθοδος <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code> έχει υλοποιηθεί στη subclass του πεδίου, τότε θα καλείται σε όλες τις περιπτώσεις που τα δεδομένα φορτώνονται από τη βάση δεδομένων, συμπεριλαμβανομένων των κλήσεων των aggregate και <a class=\"reference internal\" href=\"/el/1.11/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> καλείται κατά το deserialization και κατά τη διάρκεια της μεθόδου <a class=\"reference internal\" href=\"/el/1.11/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> που χρησιμοποιείται από τις φόρμες.</p>\n<p>Ως γενικός κανόνας, η μέθοδος <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code> θα πρέπει συνεργάζεται με οποιοδήποτε από τα ακόλουθα arguments:</p>\n<ul class=\"simple\">\n<li><p>Ένα instance ενός σωστού τύπου (πχ, του <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> στο τρέχων παράδειγμα μας).</p></li>\n<li><p>Ένα string</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (αν το πεδίο επιτρέπει <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>)</p></li>\n</ul>\n<p>Στην κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>, αποθηκεύουμε τα δεδομένα ως ένα πεδίο VARCHAR στη βάση δεδομένων, οπότε θα πρέπει να είμαστε σε θέση να επεξεργαστούμε τύπου strings και τύπου <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> στη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db_value()</span></code>. Στη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, θα πρέπει, επίσης, να δουλέψουμε με instances της κλάσης <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\">ugettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">hand_string</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;Takes a string of cards and splits into a full hand.&quot;&quot;&quot;</span>\n    <span class=\"n\">p1</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s1\">&#39;.</span><span class=\"si\">{26}</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">p2</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"s1\">&#39;..&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">p2</span><span class=\"o\">.</span><span class=\"n\">findall</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">p1</span><span class=\"o\">.</span><span class=\"n\">findall</span><span class=\"p\">(</span><span class=\"n\">hand_string</span><span class=\"p\">)]</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"mi\">4</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Invalid input for a Hand instance&quot;</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">Hand</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">from_db_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">expression</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n        <span class=\"k\">return</span> <span class=\"n\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">to_python</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">Hand</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n\n        <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">value</span>\n\n        <span class=\"k\">return</span> <span class=\"n\">parse_hand</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Σημειώστε ότι πάντα επιστρέφουμε ένα instance του <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> από αυτές τις μεθόδους. Αυτός είναι ο τύπος του Python object που θέλουμε να αποθηκεύσουμε στο attribute του model.</p>\n<p>Όσον αφορά τη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">to_python()</span></code>, αν κάτι πάει στραβά κατά τη μετατροπή της τιμής, θα πρέπει να κάνετε raise ένα <a class=\"reference internal\" href=\"/el/1.11/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a> exception (όπως κάνουμε μέσα στην <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>parse_hand <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>).</p>\n</section>\n<section id=\"converting-python-objects-to-query-values\">\n<span id=\"id3\"></span><h4>Μετατρέποντας τα Python objects σε query values<a class=\"heading-anchor\" href=\"#converting-python-objects-to-query-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Εφόσον χρησιμοποιούμε μια βάση δεδομέμων θα πρέπει, όπως είπαμε, η μετατροπή των δεδομένων να γίνεται μεταξύ Python και βάσης και αντίστροφα. Αν παρακάμψετε (override) τη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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> θα χρειαστεί, επίσης, να παρακάμψετε τη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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> για να μετατρέψετε τα Python objects σε query values, δηλαδή τιμές που καταλαβαίνει η βάση δεδομένων. Η μέθοδος αυτή θα καλείται κάθε φορά που θα ερωτάται η βάση, μέσω κάποιου query, πχ <code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel.objects.filter(...)</span></code> ή <code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel.objects.get(...)</span></code> κλπ. Με άλλα λόγια, η μέθοδος αυτή προετοιμάζει την τιμή που δόθηκε στο query (η οποία είναι ένα Python object, πχ <code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel.objects.filter(hand=Hand('...26chars',</span> <span class=\"pre\">'...26chars',</span> <span class=\"pre\">'...26chars',</span> <span class=\"pre\">'...26chars')</span></code>) σε μια τιμή που καταλαβαίνει η βάση δεδομένων (στην προκειμένη, ένα string με όλα τα φύλλα της τράπουλας ανά παίκτη, πχ “Js6h3s5d6d…”).</p>\n<p>Για παράδειγμα:</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\">Προειδοποίηση</p>\n<p>Αν τα δικά σας πεδία χρησιμοποιούν του τύπους <code class=\"docutils literal notranslate\"><span class=\"pre\">CHAR</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> ή <code class=\"docutils literal notranslate\"><span class=\"pre\">TEXT</span></code> της MySQL, θα πρέπει να σιγουρευτείτε ότι η μέθοδος <a class=\"reference internal\" href=\"/el/1.11/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> επιστρέφει πάντα μεταβλητές τύπου string. Όταν κάνετε ένα ερώτημα στη MySQL σχετικά με αυτά τα πεδία και η τιμή που δίνετε στο query είναι τύπου integer τότε η MySQL συμπεριφέρεται κάπως αναπάντεχα και τα αποτελέσματα από το query να μην είναι αυτά που περιμένετε. Αυτό το πρόβλημα δεν θα υπάρξει αν επιστρέφετε, πάντα, μια μεταβλητή τύπου string στη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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>Μετατρέποντας τα query values σε database values<a class=\"heading-anchor\" href=\"#converting-query-values-to-database-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Κάποιοι τύποι δεδομένων (πχ ημερομηνίες) χρειάζεται να είναι σε κάποια συγκεκριμένη μορφή πριν χρησιμοποιηθούν με κάποια βάση δεδομένων. Η μέθοδος <a class=\"reference internal\" href=\"/el/1.11/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> είναι το μέρος όπου αυτές οι μετατροπές πρέπει να γίνουν. Η σύνδεση (της βάση δεδομένων) που χρησιμοποιείται με το query περνάει ως το όρισμα με το όνομα <code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></code>. Αυτό σας επιτρέπει να χρησιμοποιείτε διαφορετική λογική μετατροπής με διαφορετικούς τύπους βάσης δεδομένων, αν αυτό είναι απαραίτητο.</p>\n<p>Για παράδειγμα, το Django χρησιμοποιεί την ακόλουθη μέθοδο για πεδία τύπου <a class=\"reference internal\" href=\"/el/1.11/ref/models/fields/#django.db.models.BinaryField\" title=\"django.db.models.BinaryField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BinaryField</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_db_prep_value</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">,</span> <span class=\"n\">prepared</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n    <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">BinaryField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get_db_prep_value</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">connection</span><span class=\"p\">,</span> <span class=\"n\">prepared</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">Database</span><span class=\"o\">.</span><span class=\"n\">Binary</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">value</span>\n</code></pre></div>\n<p>Σε περίπτωση που το δικό σας πεδίο χρειάζεται μια ξεχωριστή μετατροπή όταν αποθηκεύεται, δηλαδή όχι την ίδια μετατροπή που χρησιμοποιείται για συνηθισμένες παραμέτρους ενός query, μπορείτε να παρακάμψετε (override) τη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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>Επεξεργασία τιμών πριν την αποθήκευση<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>Αν θέλετε να επεξεργαστείτε την τιμή ακριβώς πριν την αποθήκευση της (στη βάση δεδομένων), μπορείτε να χρησιμοποιήσετε τη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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>. Για παράδειγμα, η κλάση του Django <a class=\"reference internal\" href=\"/el/1.11/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> χρησιμοποιεί αυτή τη μέθοδο για να θέσει το attribute στη σωστή τιμή, όταν το <a class=\"reference internal\" href=\"/el/1.11/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> ή το <a class=\"reference internal\" href=\"/el/1.11/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> είναι <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<p>Αν παρακάμψετε αυτή τη μέθοδο, θα πρέπει να επιστρέψετε στο τέλος την τιμή του attribute. Θα πρέπει, επίσης, να ενημερώσετε το αντίστοιχο attribute του μοντέλου σας αν κάνετε τυχόν αλλαγές στην τιμή ούτως ώστε τυχόν κώδικας που αναφέρεται στο μοντέλο θα βλέπει πάντα τη σωστή τιμή.</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>Προσδιορίζοντας το πεδίο της φόρμας για ένα πεδίο μοντέλου<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>Για να παραμετροποιήσετε το πεδίο της φόρμας (form field) που χρησιμοποιείται από την κλάση <a class=\"reference internal\" href=\"/el/1.11/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>, μπορείτε να παρακάμψετε (override) τη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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>Η κλάση του πεδίου της φόρμας μπορεί να οριστεί μέσω των arguments <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> και <code class=\"docutils literal notranslate\"><span class=\"pre\">choices_form_class</span></code>. Το τελευταίο χρησιμοποιείται σε περίπτωση που το πεδίο έχει ορίσει την παράμετρο choices, ενώ το πρώτο όχι. Αν αυτά τα arguments δεν δηλωθούν, τότε το πεδίο <a class=\"reference internal\" href=\"/el/1.11/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> ή <a class=\"reference internal\" href=\"/el/1.11/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>Ολόκληρο το <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> dictionary περνάει ως όρισμα απ” ευθείας στη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> του πεδίου της φόρμας. Συνήθως, το μόνο που πρέπει να κάνετε είναι να θέσετε ένα καλό <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> ως προεπιλογή για το argument <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> (και ίσως για το <code class=\"docutils literal notranslate\"><span class=\"pre\">choices_form_class</span></code>) και μετά να δώσετε τον έλεγχο στην parent class. Αυτό ίσως απαιτήσει να γράψετε ένα δικό σας πεδίο φόρμας (και ίσως ένα widget φόρμας). Δείτε στο <a class=\"reference internal\" href=\"/el/1.11/topics/forms/\"><span class=\"doc\">εγχειρίδιο για φόρμες</span></a>, για πληροφορίες σχετικά με αυτό.</p>\n<p>Συνεχίζοντας το παράδειγμα μας, μπορούμε να γράψουμε τη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">formfield</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"c1\"># This is a fairly standard way to set up some defaults</span>\n        <span class=\"c1\"># while letting the caller override them.</span>\n        <span class=\"n\">defaults</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form_class&#39;</span><span class=\"p\">:</span> <span class=\"n\">MyFormField</span><span class=\"p\">}</span>\n        <span class=\"n\">defaults</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">HandField</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">formfield</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">defaults</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Αυτό προϋποθέτει ότι έχουμε κάνει import μια κλάση φόρμας <code class=\"docutils literal notranslate\"><span class=\"pre\">MyFormField</span></code> (η οποία έχει το δικό της προεπιλεγμένο widget). Το παρών άρθρο δεν καλύπτει τη συγγραφή δικών σας πεδίων για φόρμες.</p>\n</section>\n<section id=\"emulating-built-in-field-types\">\n<span id=\"id6\"></span><h4>Προσομοιώνοντας προεγκατεστημένους (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>Αν έχετε δημιουργήσει μια μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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>, δεν θα χρειαστεί να ανησυχείτε για τη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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> – δεν θα χρησιμοποιηθεί πολύ. Μερικές φορές, όμως, η μονάδα αποθήκευσης της βάσης δεδομένων σας είναι παρόμοια, σε επίπεδο τύπου, με κάποιο άλλο πεδίο, οπότε μπορείτε να χρησιμοποιήσετε τη λογική αυτού του άλλου πεδίου για να δημιουργήσετε τη σωστή τύπου στήλη.</p>\n<p>Για παράδειγμα:</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>Ανεξαρτήτως της βάσης δεδομένων που χρησιμοποιούμε, αυτό θα σημαίνει ότι η εντολή <a class=\"reference internal\" href=\"/el/1.11/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> και άλλες SQL εντολές, θα χρησιμοποιούν τη σωστή τύπου στήλη για την αποθήκευση ενός string.</p>\n<p>Αν η μέθοδος <a class=\"reference internal\" href=\"/el/1.11/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> επιστρέφει ένα string το οποίο δεν είναι γνωστό στο Django για την βάση δεδομένων που χρησιμοποιείται – δηλαδή, δεν εμφανίζεται στο <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends.&lt;db_name&gt;.base.DatabaseWrapper.data_types</span></code> – το string θα εξακολουθήσει να χρησιμοποιείται από τον serializer, αλλά η προεπιλεγμένη μέθοδος <a class=\"reference internal\" href=\"/el/1.11/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> θα επιστρέψει <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Δείτε το εγχειρίδιο της μεθόδου <a class=\"reference internal\" href=\"/el/1.11/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> για περιπτώσεις που αυτό μπορεί να φανεί χρήσιμο. Είναι μια καλή ιδέα να θέσετε ένα όμορφα περιγραφικό string ως τύπο πεδίου για τον serializer αν πρόκειται να χρησιμοποιήσετε την έξοδο του serializer σε κάποιο άλλο μέρος, εκτός του Django.</p>\n</section>\n<section id=\"converting-field-data-for-serialization\">\n<span id=\"converting-model-field-to-serialization\"></span><h4>Μετατρέποντας τα δεδομένα του πεδίου για το serialization<a class=\"heading-anchor\" href=\"#converting-field-data-for-serialization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Για την παραμετροποίηση των τιμών ούτως ώστε να γίνουν serialized από τον serializer, μπορείτε να παρακάμψετε (override) τη μέθοδο <a class=\"reference internal\" href=\"/el/1.11/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>. Η χρήση της <code class=\"docutils literal notranslate\"><span class=\"pre\">value_from_object()</span></code> είναι ο καλύτερος τρόπος να πάρετε την τιμή του πεδίου πριν το serialization. Για παράδειγμα, εφόσον το <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code> χρησιμοποιεί strings για την αποθήκευση των δεδομένων του, μπορούμε να επαναχρησιμοποιήσουμε τον ήδη υπάρχον κώδικα που θα κάνει τη μετατροπή (<code class=\"docutils literal notranslate\"><span class=\"pre\">get_prep_value()</span></code>):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HandField</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">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>Μερικές γενικές συμβουλές<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>Η συγγραφή ενός δικού σας πεδίου μπορεί να είναι μια περίπλοκη διαδικασία, ειδικά όταν πραγματοποιείτε περίπλοκες μετατροπές μεταξύ Python objects και μορφών της βάσης δεδομένων και του serialization. Παρακάτω παρουσιάζονται δύο συμβουλές για να ομαλοποιήσουν τα πράγματα:</p>\n<ol class=\"arabic simple\">\n<li><p>Κοιτάξτε στα ήδη υπάρχοντα πεδία του Django (μέσα στο αρχείο <code class=\"file docutils literal notranslate\"><span class=\"pre\">django/db/models/fields/__init__.py</span></code>) για έμπνευση. Προσπαθήστε να βρείτε ένα πεδίο που να έχει ομοιότητες με αυτό που προσπαθήστε να επεκτείνετε, αντί να δημιουργήσετε ένα εντελώς νέο πεδίο από την αρχή.</p></li>\n<li><p>Υλοποιήστε τη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> (την <code class=\"docutils literal notranslate\"><span class=\"pre\">__unicode__()</span></code> αν δουλεύετε με την Python 2) στην κλάση που δηλώνεται ως πεδίο. Υπάρχουν πολλά μέρη όπου η προεπιλεγμένη συμπεριφορά του κώδικα του πεδίου καλεί τη συνάρτηση <a class=\"reference internal\" href=\"/el/1.11/ref/utils/#django.utils.encoding.force_text\" title=\"django.utils.encoding.force_text\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">force_text()</span></code></a> χρησιμοποιώντας την τιμή (στα παραδείγματα μας σε αυτό το άρθρο, η τιμή, <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code>, θα είναι ένα instance της κλάσης <code class=\"docutils literal notranslate\"><span class=\"pre\">Hand</span></code> και όχι της <code class=\"docutils literal notranslate\"><span class=\"pre\">HandField</span></code>). Οπότε αν η μέθοδος <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> (<code class=\"docutils literal notranslate\"><span class=\"pre\">__unicode__()</span></code> στην Python 2) μετατρέπει αυτόματα το Python object σε μια μορφή string, θα γλυτώσετε πολύ χρόνο.</p></li>\n</ol>\n</section>\n</section>\n<section id=\"writing-a-filefield-subclass\">\n<h2>Γράφοντας μια subclass ενός πεδίου τύπου <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>Επιπροσθέτως των παραπάνω μεθόδων, τα πεδια που ασχολούνται με αρχεία έχουν μερικές ακόμη απαιτήσεις, τις οποίες πρέπει να λάβετε υπόψιν σας. Η πλειονότητα των μηχανισμών που προσφέρει ένα πεδίο τύπου <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code>, όπως ο έλεγχος της μονάδας αποθήκευσης της βάσης δεδομένων (database storage) καθώς και της ανάκτησης, μπορεί να μείνει ανέπαφος, αφήνοντας τις subclasses να χειριστούν την πρόκληση της υποστήριξης ενός συγκεκριμένου τύπου αρχείου.</p>\n<p>Το Django προσφέρει μια κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code>, που χρησιμοποιείται ως μεσάζων (proxy) στα περιεχόμενα και λειτουργίες του αρχείου. Αυτή η κλάση μπορεί να γίνει subclass προκειμένου να παραμετροποιηθεί η πρόσβαση στο αρχείο και το ποιες μέθοδοι θα είναι διαθέσιμες. Βρίσκεται στο <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.fields.files</span></code> και η προεπιλεγμένη συμπεριφορά του εξηγείται στο <a class=\"reference internal\" href=\"/el/1.11/ref/files/file/\"><span class=\"doc\">εγχειρίδιο για αρχεία</span></a>.</p>\n<p>Όταν μια subclass της κλάσης <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> δημιουργηθεί, η νέα subclass <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> θα πρέπει να ξέρει πως να χρησιμοποιήσει τη subclass της <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code>. Για να γίνει αυτό, πρέπει να ορίσετε το ξεχωριστό attribute <code class=\"docutils literal notranslate\"><span class=\"pre\">attr_class</span></code> της <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> στην τιμή της νέας subclass της <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code>.</p>\n<section id=\"a-few-suggestions\">\n<h3>Μερικές προτάσεις<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>Πέρα από τις παραπάνω λεπτομέρειες, υπάρχουν μερικές κατευθυντήριες γραμμές οι οποίες μπορούν να βελτιώσουν την αποδοτικότητα και την αναγνωσιμότητα του κώδικα του πεδίου σας.</p>\n<ol class=\"arabic simple\">\n<li><p>Ο πηγαίος κώδικας του πεδίου <code class=\"docutils literal notranslate\"><span class=\"pre\">ImageField</span></code> του Django (βρίσκεται στο αρχείο <code class=\"docutils literal notranslate\"><span class=\"pre\">django/db/models/fields/files.py</span></code>) είναι ένα καλό παράδειγμα του πως να κάνετε subclass την κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> για να υποστηρίξετε έναν συγκεκριμένο τύπο αρχείου, καθώς υιοθετεί όλες τις τεχνικές που αναφέρθηκαν παραπάνω.</p></li>\n<li><p>Όσο μπορείτε να κάνετε cache τα attributes του αρχείου. Εφόσον τα αρχεία μπορεί να αποθηκεύονται σε απομακρυσμένα συστήματα αποθήκευσης, η ανάκτηση τους μπορεί να κοστίσει επιπλέον άσκοπο χρόνο ή ακόμη και χρήματα. Όταν ένα αρχείο ανακτάται ούτως ώστε να δείτε κάποιες πληροφορίες σχετικά με τα περιεχόμενα του, κάντε cache (αποθηκεύστε τα στη λανθάνουσα μνήμη) όσα περισσότερα δεδομένα μπορείτε για να μειώσετε τον αριθμό μελλοντικών προσπελάσεων του αρχείου για την απόκτηση των ίδιων πληροφοριών.</p></li>\n</ol>\n</section>\n</section>","rootId":"writing-custom-model-fields","toc":[{"title":"Εισαγωγή","anchor":"introduction","children":[{"title":"Το object του παραδείγματος μας","anchor":"our-example-object","children":[]}]},{"title":"Βασική θεωρία","anchor":"background-theory","children":[{"title":"Αποθηκευτικός χώρος στη βάση δεδομένων","anchor":"database-storage","children":[]},{"title":"Τι κάνει μια κλάση τύπου Field;","anchor":"what-does-a-field-class-do","children":[]}]},{"title":"Γράφοντας μια subclass ενός πεδίου","anchor":"writing-a-field-subclass","children":[{"title":"Deconstruction του πεδίου","anchor":"field-deconstruction","children":[]},{"title":"Αλλάζοντας την base class του δικού σας πεδίου","anchor":"changing-a-custom-field-s-base-class","children":[]},{"title":"Τεκμηριώνοντας το δικό σας πεδίο","anchor":"documenting-your-custom-field","children":[]},{"title":"Χρήσιμες μέθοδοι","anchor":"useful-methods","children":[{"title":"Δικά σας πεδία βάσης δεδομένων","anchor":"custom-database-types","children":[]},{"title":"Μετατρέποντας τιμές σε Python objects","anchor":"converting-values-to-python-objects","children":[]},{"title":"Μετατρέποντας τα Python objects σε query values","anchor":"converting-python-objects-to-query-values","children":[]},{"title":"Μετατρέποντας τα query values σε database values","anchor":"converting-query-values-to-database-values","children":[]},{"title":"Επεξεργασία τιμών πριν την αποθήκευση","anchor":"preprocessing-values-before-saving","children":[]},{"title":"Προσδιορίζοντας το πεδίο της φόρμας για ένα πεδίο μοντέλου","anchor":"specifying-the-form-field-for-a-model-field","children":[]},{"title":"Προσομοιώνοντας προεγκατεστημένους (built-in) τύπους πεδίων","anchor":"emulating-built-in-field-types","children":[]},{"title":"Μετατρέποντας τα δεδομένα του πεδίου για το serialization","anchor":"converting-field-data-for-serialization","children":[]}]},{"title":"Μερικές γενικές συμβουλές","anchor":"some-general-advice","children":[]}]},{"title":"Γράφοντας μια subclass ενός πεδίου τύπου FileField","anchor":"writing-a-filefield-subclass","children":[{"title":"Μερικές προτάσεις","anchor":"a-few-suggestions","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"Οδηγοί «Πως-να»","url":"/el/1.11/howto/"}],"prev":{"docname":"howto/custom-management-commands","title":"Γράφοντας δικές σας django-admin εντολές","url":"/el/1.11/howto/custom-management-commands/"},"next":{"docname":"howto/custom-lookups","title":"Παραμετροποιήσιμα Lookups","url":"/el/1.11/howto/custom-lookups/"},"formats":{"html":"/el/1.11/howto/custom-model-fields/","markdown":"/el/1.11/howto/custom-model-fields.md","json":"/el/1.11/howto/custom-model-fields.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/howto/custom-model-fields.txt","official":"https://docs.djangoproject.com/el/1.11/howto/custom-model-fields/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10"],"inLocales":["en","fr","ja","id","pt-br","ko","es","el","pl"]}