Skip to Content

Binary Field στο Odoo: Οδηγός για Developers & Admins

Οδηγός πρακτικός για το πεδίο Binary στο μοντέλο δεδομένων του Odoo: πώς αποθηκεύουμε αρχεία και έγγραφα, πώς διαχειριζόμαστε συνημμένα και τι ανάγκες προσαρμογής συναντούν οι τεχνικοί.
6 Μαρτίου 2026 από
Binary Field στο Odoo: Οδηγός για Developers & Admins
Dasolo
| No comments yet

Εισαγωγή


Τα πεδία που αποθηκεύουν αρχεία δεν είναι εντυπωσιακά, αλλά είναι θεμελιώδη σε κάθε πραγματική υλοποίηση Odoo. Οτιδήποτε από υπογεγραμμένες συμβάσεις και τεχνικά φυλλάδια προϊόντων μέχρι το λογότυπο της εταιρείας αποθηκεύεται μέσω ενός πεδίου Binary. Αν ξέρεις πώς διατηρούνται αυτά τα δεδομένα, πού καταλήγουν και πότε πρέπει να επιλέξεις άλλη λύση, θα αποφύγεις προβλήματα απόδοσης και θα φτιάξεις πιο αξιόπιστες μορφές και επεκτάσεις μοντέλων.


Αυτός ο οδηγός εξηγεί τι αποθηκεύει ένα Binary πεδίο, πώς επηρεάζει η χρήση του attachment τη φύση και την απόδοση της αποθήκευσης, πώς να το προσθέσεις με Odoo Studio ή με Python και πέντε πρακτικές χρήσεις σε CRM, HR, Αποθήκη, Πωλήσεις και Λογιστήριο.

Τι είναι το πεδίο Binary στο Odoo


Στο πλαίσιο του Odoo ORM, το πεδίο Binary (fields.Binary) προορίζεται για δυαδικά δεδομένα: αρχεία, εικόνες ή έγγραφα που ανεβάζουν οι χρήστες σε μια εγγραφή. Στη φόρμα εμφανίζεται ως στοιχείο μεταφόρτωσης αρχείου και με ένα κλικ ο χρήστης μπορεί να κατεβάσει το συνημμένο — από πλευράς χρήστη είναι απλό και κατανοητό.


Το πιο κρίσιμο τεχνικό σημείο είναι πού καταλήγουν τα bytes. Στις σύγχρονες εκδόσεις του Odoo, τα Binary πεδία χρησιμοποιούν συχνά το σύστημα attachment: το περιεχόμενο αποθηκεύεται στον πίνακα ir.attachment και στον filestore του server, ενώ η στήλη του μοντέλου κρατά μόνο αναφορά προς το attachment. Έτσι τα κύρια πίνακες της βάσης παραμένουν μικρότεροι και το Odoo διαχειρίζεται τα αρχεία αποδοτικά.


Στο Odoo Studio, το Binary πεδίο εμφανίζεται ως File στο εργαλείο προσθήκης πεδίων και παρέχει απλό κουμπί ανέβασμα/λήψης στη φόρμα. Για εικόνες υπάρχει ειδικός τύπος fields.Image με αυτόματη αλλαγή μεγέθους και προεπισκόπηση — γιʼ αυτό τις εικόνες καλό είναι να τις αποθηκεύουμε με τον ειδικό αυτό τύπο.


Στο επίπεδο κώδικα, ένα Binary πεδίο ορίζεται σε ένα Python μοντέλο με τρόπο αντίστοιχο με το παρακάτω παράδειγμα:


from odoo import fields, models

class ResPartner(models.Model):
    _inherit = 'res.partner'

    x_signed_contract = fields.Binary(
        string='Signed Contract',
        attachment=True,
    )
    x_signed_contract_filename = fields.Char(
        string='Signed Contract Filename',
    )

Σημαντική συνήθεια ανάπτυξης είναι να συνοδεύεις κάθε Binary πεδίο με ένα Char πεδίο για το όνομα αρχείου (συνήθως _filename). Το Odoo χρησιμοποιεί αυτό το πεδίο για να εμφανίσει και να διατηρήσει το αρχικό όνομα όταν οι χρήστες κατεβάζουν το αρχείο — χωρίς αυτό, τα downloads έχουν γενικά ονόματα.

Πώς λειτουργεί το πεδίο


Όταν ορίζεις ένα Binary πεδίο στο data model, το πλαίσιο του Odoo δημιουργεί αυτόματα τις απαραίτητες στήλες κατά την εγκατάσταση ή αναβάθμιση του module — δεν χρειάζεται χειροκίνητο SQL από εσένα.


Τρόποι αποθήκευσης

Η παράμετρος attachment σε ένα Binary πεδίο καθορίζει πού αποθηκεύονται τα bytes του αρχείου:


  • attachment=True (συνιστάται): Το περιεχόμενο του αρχείου αποθηκεύεται σαν συνημμένο στο ir.attachment και συνδέεται με την εγγραφή μέσω του model name και του record ID. Η στήλη του μοντέλου κρατά μόνο αναφορά. Αυτό διατηρεί τους πίνακες μοντέλων ελαφριούς και εκμεταλλεύεται το filestore του Odoo.
  • attachment=False: Τα base64 δεδομένα αποθηκεύονται απευθείας στη στήλη του μοντέλου. Αυτό μπορεί να φουσκώσει πολύ τα τραπέζια, να επιβραδύνει τα ερωτήματα και γενικά να δημιουργήσει προβλήματα απόδοσης. Απόφυγε αυτόν τον τρόπο για οτιδήποτε μεγαλύτερο από μικρή μικρογραφία.

Μορφή δεδομένων

Τα Binary πεδία χειρίζονται δεδομένα ως base64 κωδικοποιημένα bytes. Αν διαβάσεις το πεδίο από το ORM ή μέσω XML-RPC θα λάβεις ένα base64 string. Όταν γράφεις, πρέπει να το δώσεις επίσης σε base64 μορφή.


Στην πράξη αυτό σημαίνει κωδικοποίηση πριν το write και αποκωδικοποίηση μετά το read:


import base64

# Writing a file to a Binary field
with open('document.pdf', 'rb') as f:
    encoded = base64.b64encode(f.read()).decode('utf-8')
record.write({'x_signed_contract': encoded})

# Reading a file from a Binary field
raw_bytes = base64.b64decode(record.x_signed_contract)

Βασικά χαρακτηριστικά του πεδίου

Αυτά είναι τα πιο χρήσιμα attributes που ρυθμίζεις σε ένα Binary πεδίο στο Odoo:


  • attachment: Boolean. Αποθήκευση στο ir.attachment (True) ή στη στήλη του μοντέλου (False). Σε πρόσφατες εκδόσεις, προεπιλογή είναι True.
  • string: Η ετικέτα που εμφανίζεται στη διεπαφή.
  • required: Κάνει το πεδίο υποχρεωτικό πριν τη αποθήκευση.
  • compute: Δείχνει σε μέθοδο Python που μπορεί να παράγει δυναμικά το περιεχόμενο — π.χ. δημιουργία PDF on the fly.
  • store: Όταν συνδυάζεται με compute, αποθηκεύει το υπολογισμένο αποτέλεσμα στη βάση.
  • groups: Περιορίζει την πρόσβαση σε συγκεκριμένες ομάδες χρηστών. Σημαντικό για ευαίσθητα έγγραφα.
  • copy: Ελέγχει αν η τιμή αντιγράφεται όταν γίνεται duplicate μιας εγγραφής. Η συμπεριφορά εξαρτάται από το attachment mode και την έκδοση Odoo.

Η υποκλάση fields.Image

Το fields.Image (παρουσιάστηκε από το Odoo 13) είναι ειδικευμένο Binary για εικόνες: κάνει αυτόματη αλλαγή μεγέθους μέχρι τις καθορισμένες διαστάσεις, παρέχει preview/thumbnail και εμφανίζει σωστή προεπισκόπηση στη φόρμα. Για φωτογραφίες προϊόντων, εικόνες επαφών ή λογότυπα προτιμήστε fields.Image — βελτιώνει την εμπειρία χρήστη και περιορίζει το μέγεθος των uploads.


Πώς εμφανίζεται στις προβολές

Στις φόρμες το προεπιλεγμένο widget είναι ένα κουμπί ανεβάσματος/λήψης. Για εικόνες, χρησιμοποιήστε το widget image για thumbnail preview. Στις λίστες δεν εμφανίζουμε συνήθως τα Binary πεδία απευθείας γιατί θα τραβήξει όλο το περιεχόμενο για κάθε γραμμή και αυτό μεταφράζεται σε άσκοπη μεταφορά δεδομένων. Συνηθισμένη πρακτική είναι να δείχνεις ένα εικονίδιο ή ένα boolean που σηματοδοτεί αν υπάρχει συνημμένο.

Πρακτικά επιχειρηματικά σενάρια


Το Binary πεδίο εμφανίζεται σε πολλά modules στον πραγματικό κόσμο. Ακολουθούν πέντε ρεαλιστικά παραδείγματα χρήσης:


CRM: Αποθήκευση υπογεγραμμένων NDAs ή συμβάσεων στον πελάτη

Οι ομάδες πωλήσεων συχνά θέλουν να έχουν το υπογεγραμμένο έγγραφο στο ίδιο το προφίλ του πελάτη ή της ευκαιρίας. Ένα Binary πεδίο σε res.partner ή crm.lead δίνει άμεση πρόσβαση χωρίς να χρειάζονται εξωτερικά DMS, διευκολύνοντας τη ροή εργασίας και κρατώντας το αρχείο εκεί που οι άνθρωποι το περιμένουν κατά την πώληση.


HR: Αρχεία εργαζομένων

Το HR χρειάζεται να αποθηκεύει ταυτότητες, άδειες εργασίας, συμβάσεις και πιστοποιητικά. Με Binary πεδία στο hr.employee διατηρείς τα έγγραφα μέσα στο Odoo και μπορείς να περιορίσεις την ορατότητα με το groups ώστε μόνο οι HR managers να έχουν πρόσβαση — αυτό είναι κρίσιμο σε εταιρείες με αυστηρή προστασία προσωπικών δεδομένων.


Αποθήκη/Διανομή: Φύλλα προδιαγραφών και SDS

Προϊόντα συχνά συνοδεύονται από PDF προδιαγραφών ή φύλλα ασφάλειας. Προσθέτοντας Binary πεδίο στο product.template, το τμήμα προμηθειών και το απόθεμα βρίσκουν εύκολα τα σωστά έγγραφα απευθείας από το προϊόν — μια απλή αλλά πολύ συχνή παραμετροποίηση σε παραγωγή και διανομή.


Πωλήσεις: Σφραγίδα εταιρείας ή υπογραφή

Σε εκτυπωμένες προσφορές ή επιβεβαιώσεις παραγγελίας μπορεί να χρειάζεται το λογότυπο, η σφραγίδα ή μια εξουσιοδοτημένη υπογραφή. Ένα fields.Image σε res.company αποθηκεύει το οπτικό στοιχείο και το αναφέρει σε QWeb templates ώστε τα εκτυπωμένα έγγραφα να φεύγουν σωστά υπογεγραμμένα χωρίς χειροκίνητες παρεμβάσεις.


Λογιστήριο: Σαρωμένα παραστατικά σε έξοδα

Οι διαδικασίες εξόδων απαιτούν συνήθως απόδειξη για επιστροφή χρημάτων. Η προσθήκη ενός Binary πεδίου που κρατάει την σάρωση ή το PDF σε κάθε εγγραφή εξόδου επιτρέπει πλήρη ροή έγκρισης χωρίς να βασίζεσαι αποκλειστικά στο γενικό panel συνημμένων.

Δημιουργία ή παραμετροποίηση του Binary πεδίου


Τρόποι προσθήκης Binary πεδίου


Υπάρχουν τρεις βασικοί τρόποι, ανάλογα με το αν θέλεις no-code, ελεγχόμενο ανάπτυξη ή αυτοματισμό:

Με Odoo Studio (χωρίς κώδικα)

  1. Το Odoo Studio προσφέρει χαμηλού κόστους παραμετροποίηση. Για να προσθέσεις ένα Binary πεδίο χωρίς κώδικα:
  2. Άνοιξε το Odoo Studio από το κύριο μενού.
  3. Μεταπήδα στο φορμά όπου θέλεις το πεδίο.
  4. Σύρε ένα File πεδίο από τον επιλογέα στην φόρμα και τοποθέτησέ το.
  5. Όρισε ετικέτα και όποιους κανόνες ορατότητας χρειάζεσαι από το properties panel.

Αποθήκευσε και κλείσε το Studio. Το Studio δημιουργεί το πεδίο με πρόθεμα x_studio_ και χρησιμοποιεί attachment mode αυτόματα — είναι η πιο γρήγορη λύση για χρήστες που θέλουν ανέβασμα αρχείων χωρίς προγραμματιστή.


Με Python σε custom module

Για έργα που θέλουν version control και συνεπή ανάπτυξη σε όλα τα περιβάλλοντα, ο σωστός τρόπος είναι ο ορισμός του πεδίου σε Python μέσα σε module. Αυτό είναι το προτεινόμενο μονοπάτι για σοβαρές παραμετροποιήσεις Odoo:


from odoo import fields, models

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    x_id_document = fields.Binary(
        string='ID Document',
        attachment=True,
        groups='hr.group_hr_user',
    )
    x_id_document_filename = fields.Char(
        string='ID Document Filename',
    )

Μετά την προσθήκη στο model, βάλε το πεδίο στη φόρμα μέσω XML χρησιμοποιώντας widget='binary' και filename που δείχνει στο συνοδευτικό Char πεδίο. Το Odoo χειρίζεται τη δημιουργία στηλών κατά την εγκατάσταση/αναβάθμιση του module και η μέθοδος δουλεύει σε Odoo.sh και on‑premise deployments.


Χρήση XML-RPC API

Αν αυτοματοποιείς τη δημιουργία πεδίων μέσω script ή απομακρυσμένου deployment, μπορείς να δημιουργήσεις Binary πεδίο με το XML-RPC API:


field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_custom_document',
        'field_description': 'Custom Document',
        'model_id': model_id,
        'ttype': 'binary',
        'state': 'manual',
    }]
)

Το state: 'manual' σημαίνει ότι το πεδίο δημιουργήθηκε χειροκίνητα και όχι από module. Πεδία που φτιάχνονται μέσω API σήμερα χρησιμοποιούν attachment mode εξ ορισμού — χρήσιμο σε αυτοματοποιημένες ροές εγκατάστασης και scripts παραμετροποίησης.

Καλές πρακτικές


1. Χρησιμοποιείτε πάντα attachment=True

Εκτός αν έχετε πολύ ειδικό λόγο να αποθηκεύσετε το περιεχόμενο μέσα στη στήλη του πίνακα, επιλέξτε attachment mode. Κρατάει τη βάση καθαρή, αποφεύγει αργά queries και εκμεταλλεύεται το filestore. Για οτιδήποτε μεγαλύτερο από μικρή εικόνα μικρογραφίας το attachment είναι απαραίτητο.


2. Συνοδέψτε το Binary με πεδίο ονόματος αρχείου

Προσθέστε πάντα ένα companion _filename Char πεδίο. Χωρίς αυτό οι χρήστες θα κατεβάζουν αρχεία με γενικά ονόματα (π.χ. download). Είναι ένα μικρό βήμα που βελτιώνει πολύ την εμπειρία και θέλει μία γραμμή κώδικα.


3. Χρησιμοποιήστε fields.Image για εικόνες

Για φωτογραφίες προϊόντων, πορτραίτα ή λογότυπα προτιμήστε fields.Image: αυτόματα περιορίζει τις διαστάσεις, δίνει thumbnail preview και αποφεύγει τεράστια uploads. Εφαρμόστε τον σωστό τύπο για το περιεχόμενο που περιμένετε.


4. Περιορισμός πρόσβασης με groups

Για ευαίσθητα έγγραφα (συμβάσεις, προσωπικά αρχεία, οικονομικά) ορίστε groups στο πεδίο ώστε μόνο εξουσιοδοτημένοι χρήστες να βλέπουν ή να γράφουν. Αυτό έχει σημασία για συμμόρφωση και ελεγκτικές απαιτήσεις.


5. Διαχειριστείτε σωστά την base64 κωδικοποίηση στον κώδικα

Όταν δουλεύετε προγραμματικά με Binary, φροντίστε να κωδικοποιείτε/αποκωδικοποιείτε ρητά: base64.b64encode(file_bytes).decode('utf-8') πριν το write και base64.b64decode(value) μετά το read. Η παρανόηση της μορφής είναι πηγή bugs που εμφανίζονται μόνο με πραγματικά αρχεία.

Συνηθισμένα λάθη


Προσοχή στο attachment=False για μεγάλα αρχεία

Αποθήκευση μεγάλων αρχείων στη στήλη της βάσης μπορεί να φουσκώσει τους PostgreSQL πίνακες: μερικές δεκάδες PDFs σε attachment=False προσθέτουν εκατοντάδες MB σε έναν πίνακα, επιβραδύνοντας κάθε query. Η αλλαγή σε attachment mode μετά το γεγονός απαιτεί custom migration και προσεκτικό σχεδιασμό.


Ξεχασμένο companion πεδίο filename

Αν δεν βάλετε Char πεδίο για το όνομα αρχείου, οι χρήστες θα κατεβάζουν με γενικά ονόματα — ένα μικρό αλλά ενοχλητικό ζήτημα που κάνει το σύστημα να φαίνεται πρόχειρο. Η διόρθωση είναι απλή και αξίζει πάντα να γίνεται.


Μπερδεύετε Binary με Image

Χρησιμοποιώντας plain Binary για εικόνες χάνετε αυτόματη αλλαγή μεγέθους και thumbnails — οι χρήστες ανεβάζουν μεγάλα αρχεία που επιβαρύνουν φόρτωση και αποθήκευση. Αντίθετα, fields.Image σε μη‑εικόνες (π.χ. PDF) θα προκαλέσει σφάλματα. Κράτησε τον τύπο πεδίου σύμφωνο με το περιεχόμενο.


Εμφάνιση Binary σε λίστες

Βάζοντας Binary απευθείας σε λίστα, το Odoo θα τραβήξει το πλήρες περιεχόμενο για κάθε γραμμή — σε 50 εγγραφές μπορεί να μεταφέρει megabytes άσκοπα. Χρησιμοποίησε υπολογιζόμενο boolean ή ένα εικονίδιο για να δείχνεις την παρουσία αρχείου αντί να φορτώνεις το ίδιο το πεδίο.


Μην παραλείπεις το έλεγχο για False πριν τη διαδικασία στον κώδικα

Ένα Binary χωρίς τιμή επιστρέφει False σε Python — όχι κενή συμβολοσειρά ούτε bytes. Αν προσπαθήσεις να το decode χωρίς έλεγχο θα πάρεις TypeError. Φύλαξε πάντα: if record.x_document: data = base64.b64decode(record.x_document) — αυτό ισχύει σε compute methods, server actions και integrations.

Συμπεράσματα


Το Binary πεδίο είναι απλό στη σύλληψη αλλά κρίσιμο για σωστό μοντέλο δεδομένων στο Odoo: ενσωματώνει αποθήκευση αρχείων, διαχείριση συνημμένων και μηχανισμούς πρόσβασης με τρόπο που ταιριάζει στη διεπαφή και στις ροές εργασίας.


Οι βασικές συνήθειες που σώζουν προβλήματα: attachment mode, συνοδευτικό πεδίο filename, χρήση fields.Image για εικόνες, περιορισμός πρόσβασης όπου χρειάζεται και σωστή βάση/αποκωδικοποίηση στον κώδικα. Αυτές οι πρακτικές προλαμβάνουν τα πιο συνηθισμένα προβλήματα σε παραγωγικά συστήματα.

Είτε προσθέτεις πεδίο με Studio, είτε φτιάχνεις module σε Python είτε διαχειρίζεσαι πεδία μέσω ORM ή XML-RPC, το σωστό setup των Binary πεδίων από την αρχή εξασφαλίζει πιο καθαρή, πιο αξιόπιστη και πιο εύκολη στη συντήρηση Odoo υλοποίηση.

Στη Dasolo υποστηρίζουμε εταιρείες στην υλοποίηση, παραμετροποίηση και βελτιστοποίηση του Odoo για όλα τα τμήματα. Αν χρειάζεσαι βοήθεια στο σχεδιασμό του data model, σε ροές διαχείρισης αρχείων ή στην ανάπτυξη custom modules, η ομάδα μας αναλαμβάνει την υλοποίηση. Επικοινώνησε μαζί μας και συζητάμε το Odoo project σου.

Binary Field στο Odoo: Οδηγός για Developers & Admins
Dasolo 6 Μαρτίου 2026
Share this post
Σύνδεση to leave a comment