Εισαγωγή
Αν έχετε δουλέψει με το μοντέλο δεδομένων του Odoo, σίγουρα έχετε χρειαστεί να εμφανίσετε πληροφορία από ένα συνδεδεμένο αρχείο απευθείας σε μια φόρμα — χωρίς να αναγκάζετε τον χρήστη να ανοίξει άλλη εγγραφή. To Related πεδίο είναι το εργαλείο που το κάνει αυτό απλά και δηλωτικά, χωρίς επιπλέον κώδικα.
Αντί να φτιάξετε ένα υπολογιζόμενο πεδίο με Python, το Related «περπατάει» μια αλυσίδα σχέσεων και φέρνει στην επιφάνεια την τιμή στο τέλος της. Είναι ένα από τα πιο πρακτικά εργαλεία για προγραμματιστές και συμβούλους που θέλουν να εμφανίσουν σχετικό περιεχόμενο μέσα στη σωστή ροή εργασίας.
Ο οδηγός αυτός περιγράφει τι ακριβώς αποτυπώνει ένα Related πεδίο, πώς το διαχειρίζεται το πλαίσιο του Odoo, πώς να το προσθέσετε είτε με Studio είτε με κώδικα, και πού θα το χρησιμοποιήσετε σε πραγματικά σενάρια επιχειρήσεων.
Τι είναι το Related πεδίο στο Odoo
Στον ORM του Odoo το Related δεν είναι ξεχωριστός τύπος όπως Char ή Float· είναι ουσιαστικά μια συντόμευση που «ξετυλίγει» ένα πεδίο από άλλο μοντέλο ακολουθώντας μια αλυσίδα σχέσεων. Το Related κληρονομεί τον τύπο του πεδίου που τελικά στοχεύει.
Ένα απλό παράδειγμα: στην παραγγελία πωλήσεων υπάρχει το partner_id (Many2one προς res.partner). Ένα Related με path partner_id.country_id εμφανίζει τη χώρα του πελάτη πάνω στην παραγγελία χωρίς να αποθηκεύει ξεχωριστή τιμή.
Από άποψη διεπαφής, το Related εμφανίζεται όπως κάθε άλλο πεδίο: αν το τελικό πεδίο είναι κείμενο, βλέπετε πεδίο κειμένου· αν είναι Many2one, βλέπετε επιλογή. Κληρονομεί την εμφάνιση του πεδίου που αντιγράφει.
Κατ’ αρχάς, τα Related πεδία είναι συνήθως μη επεξεργάσιμα και μη αποθηκευμένα. Αυτό σημαίνει ότι πάντα δείχνουν την τρέχουσα τιμή από την πηγή, αλλά δεν μπορείτε να τα χρησιμοποιήσετε σε domain φίλτρα σε επίπεδο βάσης δεδομένων εκτός αν ορίσετε store=True.
Στο Odoo Studio μπορείτε να προσθέσετε Related πεδίο από το UI: επιλέγετε τη διαδρομή σχέσεων και το Studio δημιουργεί το κατάλληλο πεδίο. Για συμβούλους αυτό είναι ο γρηγορότερος τρόπος να προσθέσετε περιβάλλοντική πληροφορία χωρίς κώδικα.
Πώς λειτουργεί τεχνικά
Όταν το Odoo διαβάζει ένα Related, ακολουθεί τα ονόματα πεδίων χωρισμένα με τελείες. Κάθε βήμα εκτός του τελευταίου πρέπει να είναι σχεσιακό (Many2one/One2many/Many2many). Το τελικό στοιχείο μπορεί να είναι οποιουδήποτε τύπου.
Παρακάτω υπάρχει ένα πρακτικό παράδειγμα ορισμού Related πεδίου σε Python:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
partner_country_id = fields.Many2one(
related='partner_id.country_id',
string='Customer Country',
store=True,
)
Στο παράδειγμα το Odoo ακολουθεί το partner_id για να φτάσει στην εγγραφή res.partner και διαβάζει country_id. Το αποτέλεσμα συμπεριφέρεται σαν Many2one στο μοντέλο της παραγγελίας που αντικατοπτρίζει τη χώρα του πελάτη.
Αποθηκευμένα έναντι μη-αποθηκευμένων Related πεδίων
Η κρίσιμη διάκριση: εξ ορισμού related πεδία έχουν store=False, δηλαδή υπολογίζονται κάθε φορά που διαβάζετε την εγγραφή και δεν υπάρχουν στη φυσική στήλη του πίνακα.
Με store=True, το Odoo αποθηκεύει την τιμή στη βάση όταν αλλάξει η πηγή. Έτσι μπορείτε να φιλτράρετε, να ομαδοποιείτε και να αναζητάτε βάσει αυτού του πεδίου — απαραίτητο για αναφορές και λίστες.
Το κόστος είναι χώρος στη βάση και triggers ενημέρωσης όταν αλλάζει η πηγή. Το Odoo τα διαχειρίζεται με το σύστημα εξαρτήσεων, αλλά σε μοντέλα με πολλά records αυτό μπορεί να επηρεάσει την απόδοση.
Αν είναι μόνο για ανάγνωση ή και εγγράψιμα;
Καθώς από προεπιλογή είναι read-only, μπορείτε να θέσετε readonly=False για να γίνουν επεξεργάσιμα. Όμως κάθε αλλαγή «γράφεται» πίσω στην πηγή — δηλαδή, αν επεξεργάζεστε το Related πεδίο μιας παραγγελίας που δείχνει το τηλέφωνο του πελάτη, αλλάζετε το αρχείο του πελάτη, όχι της παραγγελίας.
Χρησιμοποιείστε writable Related μόνο όταν επιθυμείτε σαφώς αυτή την συμπεριφορά write-through. Είναι χρήσιμο για γρήγορες διορθώσεις αλλά μπορεί να προκαλέσει ανεπιθύμητες αλλαγές αν οι χρήστες δεν το γνωρίζουν.
Κύριες ιδιότητες πεδίου
Αυτά είναι τα κύρια attributes που ρυθμίζετε σε ένα Related:
- related: Η αλυσίδα πεδίων με τελείες (π.χ. 'partner_id.country_id'). Είναι το μόνο απαιτούμενο στοιχείο.
- store: Βάλτε True για να επιμείνει η τιμή στη βάση. Επιτρέπει φίλτρα/ομαδοποιήσεις.
- readonly: Βάλτε False για να γίνει επεξεργάσιμο και να γράφει στην πηγή.
- string: Η ετικέτα που βλέπει ο χρήστης. Αν δεν δοθεί, παίρνει την ετικέτα του τελικού πεδίου.
- depends: Σπανίως χρειάζεται γιατί το Odoo καταλαβαίνει τις εξαρτήσεις από το related chain. Χρησιμοποιείται μόνο σε ειδικές περιπτώσεις.
Πώς συνεργάζεται με τον ORM του Odoo
Το Related επιστρέφει την τιμή του τελικού πεδίου στην συνδεδεμένη εγγραφή. Αν κάποιο ενδιάμεσο βήμα είναι κενό (π.χ. partner_id μη ορισμένο), το Related επιστρέφει False — η αναμενόμενη συμπεριφορά του ORM.
Όταν είναι stored, τα Related εμφανίζονται κανονικά σε domains, views και αναφορές. Αν δεν είναι stored, μπορούν να εμφανιστούν σε φόρμες και λίστες αλλά δεν χρησιμεύουν για φίλτρα σε SQL-level αναζητήσεις.
Πραγματικές επιχειρησιακές εφαρμογές
Χρήσεις σε πραγματικές ροές εργασίας — πέντε παραδείγματα
CRM & Πωλήσεις: Τηλέφωνο πελάτη στην παραγγελία
Οι ομάδες πωλήσεων ζητούν συχνά το τηλέφωνο του πελάτη στην ίδια τη φόρμα παραγγελίας. Ένα Related partner_id.phone το εμφανίζει άμεσα, διευκολύνοντας τις κλήσεις και μειώνοντας τα βήματα για τον χρήστη — χωρίς ανάπτυξη. Στο Studio γίνεται σε λίγα δευτερόλεπτα.
Λογιστήρια: Νόμισμα εταιρείας σε γραμμές τιμολογίων
Σε multi-company περιβάλλοντα, είναι χρήσιμο να δείχνετε το νόμισμα της εταιρείας στη γραμμή του τιμολογίου. Ένα related όπως move_id.company_id.currency_id κάνει chain δύο Many2one και φέρνει το νόμισμα. Είναι καλό να αποθηκεύετε τέτοια πεδία αν θέλετε φιλτράρισμα ή αναφορές ανά νόμισμα.
Αποθήκη: Κατηγορία προϊόντος σε κινήσεις αποθέματος
Η ομάδα αποθήκης χρειάζεται συχνά την κατηγορία προϊόντος στην κίνηση χωρίς να ανοίγει την καρτέλα του προϊόντος. Ένα Related product_id.categ_id σε stock.move.line το εμφανίζει άμεσα, και με store=True επιτρέπει ομαδοποιήσεις στις αναφορές αποθέματος.
Παραγωγή: Εσωτερικός κωδικός σε γραμμές εργασίας
Στη γραμμή εργασίας παραγωγής, το να βλέπει ο χειριστής τον internal reference (product_id.default_code) μειώνει τα λάθη όταν υπάρχουν παρόμοια εξαρτήματα. Μικρές προσαρμογές αυτού του τύπου αυξάνουν την ακρίβεια στο πάτωμα παραγωγής.
Χρονισμοί & Έργα: Τμήμα υπαλλήλου σε χρονοδιαγραμμίσεις
Οι διαχειριστές έργων χρειάζονται συχνά το τμήμα του υπαλλήλου για κόστος. Ένα related employee_id.department_id στο account.analytic.line (τιμολόγηση/χρονικό διάγραμμα) το φέρνει στην εγγραφή και, εφόσον είναι stored, επιτρέπει φιλτράρισμα ανά τμήμα στις αναφορές έργου.
Πώς να δημιουργήσετε ή να προσαρμόσετε ένα Related πεδίο
Τρόποι προσθήκης Related πεδίου
Υπάρχουν τρεις κύριοι τρόποι, ανάλογα με τα εργαλεία και την εγκατάσταση: Studio, Python module, ή προγραμματική δημιουργία μέσω API.
Χρήση Odoo Studio (χωρίς κώδικα)
- Ανοίξτε το Odoo Studio από το μενού.
- Πηγαίνετε στη φόρμα όπου θέλετε το πεδίο.
- Κάντε κλικ στο «Προσθήκη πεδίου» και επιλέξτε Related Field.
- Επιλέξτε βήμα-βήμα την relational διαδρομή από τα διαθέσιμα πεδία.
- Ορίστε ετικέτα και αν θα είναι αποθηκευμένο ή επεξεργάσιμο.
- Αποθηκεύστε και κλείστε το Studio.
Το Studio δημιουργεί το πεδίο με πρόθεμα x_studio_ και το τοποθετεί στη θέα. Είναι ο πιο γρήγορος τρόπος για συμβούλους να εμπλουτίσουν φόρμες χωρίς αλλαγές στη βάση από την πλευρά τους.
Προσθήκη μέσω Python σε προσαρμοσμένο module
Για προγραμματιστές που δουλεύουν με κώδικα, τα Related δηλώνονται στην κλάση του μοντέλου — η σωστή πρακτική για version control και πολυ-περιβάλλοντα αναπτύξεις.
from odoo import fields, models
class StockMoveLine(models.Model):
_inherit = 'stock.move.line'
product_category_id = fields.Many2one(
related='product_id.categ_id',
string='Product Category',
store=True,
)
Μετά προσθέστε το πεδίο στη σχετική view XML για να εμφανιστεί. Η δημιουργία της στήλης στη βάση γίνεται αυτόματα κατά την εγκατάσταση/αναβάθμιση του module — η προτεινόμενη μέθοδος για συντηρήσιμες προσαρμογές.
Χρήση XML-RPC API
Σε αυτοματοποιημένες εγκαταστάσεις, μπορείτε να δημιουργήσετε Related πεδία μέσω του XML-RPC ορίζοντας το related attribute στο definition του πεδίου.
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_partner_country_id',
'field_description': 'Customer Country',
'model_id': sale_order_model_id,
'ttype': 'many2one',
'relation': 'res.country',
'related': 'partner_id.country_id',
'store': True,
'readonly': True,
'state': 'manual',
}]
)
Όταν δημιουργείτε πεδία μέσω API πρέπει να δηλώσετε χειροκίνητα ttype και relation, γιατί το API δεν τα συμπεραίνει όπως ο Python ORM. Αυτή η μέθοδος είναι χρήσιμη σε αυτοματισμούς εγκατάστασης και απομακρυσμένες διαμορφώσεις.
Βέλτιστες πρακτικές
Συνιστάται: πότε να έχετε store=True
Αν θέλετε φίλτρα ή ομαδοποιήσεις βάσει του Related πεδίου, βάλτε store=True. Χωρίς αυτό το Odoo δεν μπορεί να κάνει SQL-level φίλτρα και θα επιχειρήσει να φορτώσει όλα τα records σε Python, κάτι που δεν κλιμακώνεται.
Κρατήστε την αλυσίδα σύντομη
Σύνδεσμοι δύο επιπέδων (π.χ. partner_id.country_id) είναι αποδοτικοί. Πολύ βαθιές αλυσίδες αυξάνουν τα σημεία αστοχίας και δυσκολεύουν την συντήρηση — σε τέτοιες περιπτώσεις σκεφτείτε ένα computed πεδίο με Python για μεγαλύτερη σαφήνεια.
Κατανοήστε τι σημαίνει readonly=False
Writable Related δεν αντιγράφει το δεδομένο τοπικά — ενημερώνει την πηγή. Αν κάνετε το partner_id.phone επεξεργάσιμο στην παραγγελία, αλλάζετε το res.partner και επηρεάζετε κάθε συσχετισμένο έγγραφο. Βεβαιωθείτε ότι αυτό είναι επιθυμητό και ενημερώστε τους χρήστες.
Χρησιμοποιήστε Related για εμφάνιση, όχι για διπλασιασμό δεδομένων
Τα Related υπάρχουν για να εμφανίζουν υπάρχοντα δεδομένα στο σωστό context. Αν θέλετε ανεξάρτητη αντιγραφή που μπορεί να αποκλίνει, χρησιμοποιήστε απλό πεδίο με default ή onchange/automated action αντί για Related με store+readonly=False.
Ελέγξτε τα δικαιώματα πρόσβασης
Το Related «διαβάζει» σε άλλο μοντέλο — αν ο χρήστης δεν έχει δικαίωμα ανάγνωσης στο ενδιάμεσο μοντέλο, το πεδίο θα εμφανίζεται κενό. Αυτό μπορεί να μπερδέψει χρήστες, οπότε ελέγξτε ότι οι ρόλοι έχουν τα αναγκαία δικαιώματα.
Συνηθισμένα λάθη και παγίδες
Φιλτράρισμα σε μη-αποθηκευμένο Related
Το πιο συνηθισμένο λάθος: προσθέτουν Related σε λίστα και προσπαθούν να φιλτράρουν χωρίς store=True. Χωρίς αποθήκευση, το domain δεν δουλεύει σε επίπεδο βάσης και είτε πετάει σφάλμα είτε δεν επιστρέφει αποτελέσματα. Αν σκοπεύετε να φιλτράρετε/ομαδοποιήσετε, βάλτε store=True.
Απρόσμενο write-through
Πολλοί εκπλήσσονται όταν ένα Related γίνεται επεξεργάσιμο μέσω Studio και αλλάζει πηγαία εγγραφή. Πριν θέσετε readonly=False, συμφωνήστε με το επιχειρησιακό team ότι θέλετε οι αλλαγές να επηρεάζουν το αρχείο πηγής.
Μη διαχείριση κενών ενδιάμεσων τιμών
Αν κάποιο ενδιάμεσο πεδίο στην αλυσίδα είναι κενό, το Related επιστρέφει False. Σε κώδικα πρέπει να χειριστείτε αυτή την περίπτωση για να αποφύγετε TypeErrors — κάτι που πολλές φορές εμφανίζεται μόνο σε παραγωγή όταν υπάρχουν ελλιπή δεδομένα.
Όταν πρέπει να χρησιμοποιήσετε Computed αντί για Related
Το Related δουλεύει καλύτερα για απλό «καθρέφτη» μιας τιμής. Αν χρειάζεστε λογική, μετασχηματισμούς ή συνθήκες, ένα computed πεδίο με Python είναι πιο ξεκάθαρο και πιο εύκολο στη συντήρηση από πολύπλοκα related chains.
Προβλήματα απόδοσης με πολλά stored Related σε μεγάλα μοντέλα
Κάθε stored Related χρειάζεται ενημέρωση όταν αλλάζει η πηγή. Αν έχετε δεκάδες stored Related σε πίνακες με εκατοντάδες χιλιάδες εγγραφές, και οι πηγές αλλάζουν συχνά, δημιουργείται σημαντικό φορτίο εγγραφών. Σε μεγάλα έργα, μετρήστε την επίπτωση και προτιμάτε unstored όπου η real-time ακρίβεια δεν είναι κρίσιμη.
Συμπέρασμα
Κλείνοντας, το Related πεδίο είναι ένα από τα πιο χρήσιμα εργαλεία του Odoo για να εμφανίσετε περιβάλλοντικές πληροφορίες χωρίς να διπλασιάζετε δεδομένα. Διαβάζει μέσα από σχέσεις, φέρνει τιμές από συνδεδεμένες εγγραφές και, αν χρειάζεται, τις αποθηκεύει για αναφορές και φίλτρα.
Κατάλληλη χρήση του store=True, κατανοώντας το readonly=False και ορθή διαχείριση κενών ενδιάμεσων πεδίων θα σας γλυτώσει από τα πιο συνηθισμένα προβλήματα δεδομένων. Είτε αναπτύσσετε modules, είτε χρησιμοποιείτε Studio, είτε διαχειρίζεστε απομακρυσμένες ρυθμίσεις, το Related πεδίο αξίζει να είναι στο toolkit σας.
Αν χτίζετε ή επεκτείνετε μοντέλα Odoo, τα Related πεδία πρέπει να συνυπάρχουν με Computed, Many2one και τα υπόλοιπα τυπικά πεδία στην εργαλειοθήκη σας.
Στην εταιρεία Dasolo βοηθάμε επιχειρήσεις να υλοποιήσουν, να προσαρμόσουν και να βελτιστοποιήσουν το Odoo σε Πωλήσεις, Επιχειρήσεις, Λογιστήρια και άλλα. Αν χρειάζεστε βοήθεια στο σχεδιασμό του data model, την προσθήκη πεδίων ή την επέκταση του Odoo με καθαρό, συντηρήσιμο κώδικα, μπορούμε να αναλάβουμε. Επικοινωνήστε μαζί μας και ας συζητήσουμε πώς να υποστηρίξουμε το Odoo έργο σας.