Passa al contenuto

Campi Ereditati in Odoo: Come l'ORM Condivide Dati tra i Modelli

Una guida pratica per comprendere l'ereditarietà dei campi in Odoo e come utilizzarla nelle tue personalizzazioni
6 marzo 2026 di
Campi Ereditati in Odoo: Come l'ORM Condivide Dati tra i Modelli
Dasolo
| Ancora nessun commento

Introduzione


Quando inizi a lavorare con lo sviluppo di Odoo, un concetto emerge ripetutamente: l'ereditarietà. L'ORM di Odoo è costruito attorno all'idea che i modelli possano estendere, condividere e riutilizzare i campi l'uno dell'altro senza duplicare dati o scrivere codice ridondante.


I campi ereditati sono centrali in questo sistema. Sono il modo in cui Odoo consente a un modello di accedere e esporre in modo trasparente i campi che sono fisicamente definiti e memorizzati su un altro modello. Una volta compreso questo meccanismo, molte cose nel modello di dati di Odoo iniziano a avere senso.


Questa guida spiega cosa sono i campi ereditati, i tre tipi di ereditarietà dei modelli che li producono, come si comportano nel database e come puoi usarli in progetti di personalizzazione reali di Odoo.

Che cos'è un campo ereditato in Odoo?


Nel framework ORM di Odoo, un campo è considerato ereditato quando un modello guadagna accesso ai campi definiti su un altro modello attraverso uno dei tre meccanismi di eredità supportati. Invece di ridefinire quei campi da zero, il modello figlio li riutilizza semplicemente.


Questo è parte di ciò che rende il modello dati di Odoo così compatto e coerente. Lo stesso campo name su un record partner è quello che appare sugli ordini di vendita, sui lead CRM e sulle fatture, perché tutti questi modelli alla fine leggono dalla stessa fonte.


I Tre Tipi di Eredità in Odoo

Odoo supporta tre distinti tipi di eredità dei modelli, e ognuno gestisce i campi in modo diverso.

1. Eredità Classica

Questo è il modello più comune nello sviluppo di Odoo. Si utilizza _inherit senza definire un nuovo _name. Questo estende direttamente un modello esistente, aggiungendo nuovi campi o metodi ad esso. Non viene creata una nuova tabella nel database. I nuovi campi appaiono semplicemente sul modello originale.


Questo è il modo in cui la maggior parte dei moduli Odoo aggiunge campi ai modelli standard. Se installi il modulo CRM, aggiunge campi a res.partner attraverso l'eredità classica. Quei campi sono memorizzati nella tabella partner insieme ai campi core.


2. Eredità da Prototipo

Questo è quando combini _inherit e _name insieme. Il nuovo modello inizia come una copia della struttura del modello genitore, ma ottiene la propria tabella nel database. Tutti i campi del genitore sono duplicati nel nuovo modello. Le modifiche al modello figlio non influenzano il genitore.


Questo modello è meno comune nella personalizzazione quotidiana ma viene utilizzato per creare modelli completamente nuovi che condividono la struttura di uno esistente.


3. Eredità per Delegazione

Questo è il tipo più distintivo, definito utilizzando _inherits. Il modello figlio si collega a un modello genitore attraverso un campo Many2one. Il modello figlio espone poi in modo trasparente tutti i campi del genitore come se fossero propri. I dati risiedono nella tabella del genitore, non nella tabella del figlio.

Questo è ciò che la maggior parte degli sviluppatori intende quando parla di campi ereditati in senso stretto. I campi non sono duplicati. Vengono accessibili attraverso il collegamento relazionale in fase di lettura e scrittura.


L'esempio più famoso in Odoo standard è la relazione tra res.users e res.partner. Ogni utente è anche un partner. Il nome, l'email e il numero di telefono dell'utente sono memorizzati nel record del partner e accessibili dall'utente tramite l'ereditarietà per delega.

Come funziona il campo


Ereditarietà per Delegazione Sotto il Cofano

Quando un modello utilizza _inherits, l'ORM di Odoo crea un ponte trasparente tra due tabelle del database. Quando leggi un campo ereditato nel record figlio, Odoo segue automaticamente il collegamento Many2one al record genitore e restituisce il valore memorizzato lì.


Quando scrivi a un campo ereditato dal modello figlio, Odoo scrive direttamente nel record genitore. Dalla prospettiva dello sviluppatore, il campo sembra nativo. Dalla prospettiva del database, i dati risiedono nella tabella genitore.


Questo ha una conseguenza importante: non c'è duplicazione dei dati. Se aggiorni il nome di un partner, quella modifica si riflette immediatamente ovunque il partner è referenziato, incluso nel record utente che ne eredita.


Ereditarietà Classica e il Database

Con l'ereditarietà classica, nuovi campi vengono aggiunti alla tabella del database del modello originale. Non è coinvolta una seconda tabella. Il modello esteso e il modello originale sono la stessa cosa nel database. Questo è il modo più pulito e comune per aggiungere campi nei progetti di personalizzazione di Odoo.


Campi Relazionati come Ereditarietà Leggera

Un campo related è un tipo speciale di campo calcolato nell'ORM di Odoo che legge un valore da un record collegato attraverso una catena di campi relazionali. Non è esattamente la stessa cosa dell'ereditarietà del modello, ma viene spesso utilizzato per visualizzare dati in stile ereditario su un modello senza modificare la struttura del modello.


Ad esempio, potresti definire un campo partner_country_id su un ordine di vendita che legge partner_id.country_id. Il campo si comporta come un campo nativo sull'ordine di vendita, ma il valore proviene dal partner.

I campi relazionati possono essere memorizzati nel database con store=True, il che migliora le prestazioni di ricerca e filtro, ma aggiunge un sovraccarico di archiviazione e richiede ricalcolo quando la sorgente cambia.


Come vengono risolti i campi a runtime

Quando Odoo carica una definizione di modello, risolve l'intera mappa dei campi, inclusi tutti i campi ereditati. Quando un modello è pronto per l'uso, Odoo ha già mappato ogni campo accessibile alla sua sorgente, che sia la tabella del modello stesso, una tabella genitore tramite delega, o una catena correlata. Questa risoluzione avviene una sola volta all'avvio del server ed è memorizzata nella cache per migliorare le prestazioni.

Casi d'uso aziendali


I campi ereditati non sono solo un concetto tecnico. Risolvono problemi aziendali reali mantenendo i dati coerenti in diverse parti di Odoo senza duplicazione.


1. CRM e Vendite: Informazioni di Contatto

Quando un venditore crea un lead nel modulo CRM, il nome del cliente, il numero di telefono e l'indirizzo email provengono dal record del partner tramite un collegamento Many2one. Se i dettagli del partner cambiano, ogni lead, preventivo e ordine collegato a quel partner riflette immediatamente l'aggiornamento.


Questa è l'eredità classica e i campi correlati che lavorano insieme. Il modulo CRM estende res.partner con campi specifici per il CRM (come il conteggio dei lead e la fase dell'opportunità), e gli ordini di vendita mostrano le informazioni di contatto del partner tramite campi correlati.


2. Prodotti e Varianti

Il modello di prodotto di Odoo utilizza l'eredità di delega per gestire le varianti di prodotto in modo pulito. Il modello product.product (una variante specifica) utilizza _inherits per collegarsi a product.template. I campi condivisi tra tutte le varianti, come nome del prodotto, categoria, prezzo di vendita e descrizione, risiedono sul template. I campi specifici della variante come codice a barre o riferimento interno risiedono sul record della variante stessa.


Questo design significa che puoi avere 50 varianti di colore di una maglietta, tutte condividendo lo stesso nome e descrizione, senza memorizzare quei valori 50 volte nel database.


3. Utenti e Partner

Ogni utente di Odoo è anche un contatto. Il modello res.users utilizza _inherits = {'res.partner': 'partner_id'}, il che significa che l'utente eredita automaticamente tutti i campi del partner, inclusi nome, email, telefono, indirizzo e foto del profilo. Quando aggiorni l'indirizzo email di un dipendente, si aggiorna sia nelle impostazioni dell'utente che nella rubrica contemporaneamente.


4. Inventario: Movimenti di Magazzino e Informazioni sul Prodotto

Le righe di movimento delle scorte nel modulo Inventario mostrano le descrizioni dei prodotti che provengono dal modello di prodotto attraverso una catena di campi correlati. I responsabili di magazzino vedono informazioni sui prodotti accurate e aggiornate direttamente nelle loro liste di prelievo senza che il modulo inventario debba duplicare i dati del prodotto.


5. Contabilità: Righe della Fattura

Le righe di movimento contabile fanno riferimento a prodotti e partner. Il nome del prodotto, i codici conto e le configurazioni fiscali mostrati su una riga di fattura sono estratti dai modelli di prodotto e partner attraverso collegamenti relazionali e campi correlati. I contabili vedono dati coerenti che corrispondono a quanto configurato dai team di vendita sul prodotto, poiché leggono dalla stessa fonte.

Creazione o personalizzazione di campi ereditati


Utilizzando Odoo Studio

Odoo Studio è l'interfaccia senza codice per personalizzare i modelli e le viste di Odoo. Da Studio, puoi aggiungere nuovi campi a qualsiasi modello senza scrivere codice Python. Ciò che Studio fa sotto il cofano è l'ereditarietà classica: estende il modello aggiungendo un nuovo campo alla sua definizione.


Studio ti consente anche di creare campi correlati. Quando scegli "Campo Correlato" come tipo di campo, puoi puntare a qualsiasi campo accessibile attraverso una catena relazionale dal modello corrente. Ad esempio, nel modello dell'ordine di vendita, puoi creare un campo correlato che legge il paese del cliente o il numero di partita IVA direttamente dal record del partner.


Per la maggior parte degli utenti aziendali e dei consulenti funzionali, Studio è lo strumento giusto per aggiungere campi a Odoo. Gestisce automaticamente la denominazione dei campi, la migrazione del database e il posizionamento delle viste.


Personalizzazione Tecnica con Python

Per gli sviluppatori che costruiscono moduli Odoo, i campi ereditati sono definiti in Python utilizzando la classe models.Model dell'ORM di Odoo.


Ereditarietà classica per aggiungere un campo personalizzato a un modello esistente:

class CrmLead(models.Model):
    _inherit = 'crm.lead'

    x_contract_value = fields.Float(
        string='Valore Stimato del Contratto'
    )

Ereditarietà di delega per creare un nuovo modello che condivide campi da uno esistente:

class EmployeeProfile(models.Model):
    _name = 'hr.employee.profile'
    _inherits = {'res.partner': 'partner_id'}

    partner_id = fields.Many2one(
        'res.partner',
        required=True,
        ondelete='cascade'
    )
    employee_id = fields.Many2one(
        'hr.employee',
        string='Employee'
    )

Campi correlati per visualizzare un valore da un record collegato:

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    partner_country_id = fields.Many2one(
        related='partner_id.country_id',
        string='Paese del Cliente',
        store=True
    )

Via API XML-RPC (Configurazione Remota)

I campi possono essere aggiunti anche programmaticamente utilizzando l'API XML-RPC di Odoo e il modello ir.model.fields. Questo è l'approccio utilizzato nei notebook di configurazione remota di Dasolo. È equivalente a ciò che fa Studio e consente la creazione di campi senza accesso diretto al server.


Per aggiungere un campo correlato tramite l'API, si crea un record ir.model.fields con ttype='many2one' (o il tipo appropriato) e si imposta il parametro related per definire il percorso relazionale. Questo approccio è ben adatto per distribuire campi personalizzati come parte di un processo di configurazione automatizzato.

Migliori pratiche


Scegli il Tipo di Ereditarietà Giusto per il Lavoro

Utilizza l'ereditarietà classica quando desideri semplicemente aggiungere campi o metodi a un modello esistente. È l'approccio più semplice ed è quello utilizzato dalla stragrande maggioranza dei moduli Odoo. Riserva l'ereditarietà per delega per i casi in cui hai realmente bisogno di due set di record separati collegati tra loro, come quando un concetto aziendale estende un contatto senza essere un contatto stesso.


Preferisci i Campi Correlati per l'Accesso in Lettura

Se hai solo bisogno di visualizzare un valore da un record collegato in un modulo o in una vista elenco, un campo correlato è più pulito rispetto all'ereditarietà per delega. Evita di creare una nuova dipendenza strutturale ed è facile da comprendere e mantenere.


Fai Attenzione a store=True sui Campi Correlati

Memorizzare un campo correlato nel database accelera le ricerche e i filtri, ma significa che il valore è una copia. Odoo attiva la ricomputazione quando la sorgente cambia, ma in casi limite questo può andare fuori sincronizzazione. Memorizza i campi correlati solo quando hai realmente bisogno di filtrare o ordinare per essi su larga scala.


Prefissa sempre i campi personalizzati con x_

Qualsiasi campo che aggiungi a un modello Odoo standard tramite ereditarietà dovrebbe iniziare con x_ (o utilizzare uno spazio dei nomi del modulo in un modulo appropriato). Questo previene conflitti con i campi aggiunti da Odoo nelle versioni future.


Documenta la tua catena di ereditarietà

Quando lavori su personalizzazioni complesse, scrivi un breve commento o nota di design che spieghi da dove provengono i campi e perché. Un campo chiamato x_country_code su un ordine di vendita potrebbe non collegarsi ovviamente a partner_id.country_id.code senza documentazione.


Gestisci correttamente le cancellazioni a cascata

Nell'ereditarietà di delega, il record padre viene creato automaticamente quando viene creato il figlio. Quando il figlio viene eliminato, il padre dovrebbe di solito essere eliminato anche. Imposta ondelete='cascade' sul Many2one in _inherits per garantire una cancellazione pulita senza record orfani.


Trappole comuni


Confondere i tre tipi di ereditarietà

L'errore più comune per gli sviluppatori nuovi di Odoo è usare _inherit con _name quando intendevano un'estensione classica. Questo crea accidentalmente un nuovo modello invece di estendere quello esistente. Controlla due volte la definizione del tuo modello: se non intendi creare un nuovo modello, ometti _name.


Dimenticare di creare il record padre in _inherits

Con l'ereditarietà di delega, il record padre non si crea automaticamente in tutti gli scenari. Quando crei un record figlio programmaticamente tramite l'API o in uno script, devi lasciare che l'ORM di Odoo gestisca la creazione del padre (cosa che fa quando usi create normalmente) oppure creare prima il record padre e passare il suo ID. Saltare questo passaggio provoca un errore di vincolo del database.


Cercare di cambiare il tipo di un campo tramite ereditarietà

Odoo non consente di sovrascrivere il tipo di un campo esistente tramite ereditarietà. Puoi cambiare attributi come l'etichetta della stringa, il dominio o il testo di aiuto, ma non puoi cambiare un campo Char in un campo Integer. Tentare di farlo causerà un errore di installazione del modulo.


Eccessivo utilizzo di campi correlati memorizzati

Aggiungere store=True a ogni campo correlato è allettante per motivi di prestazioni, ma aumenta la dimensione del database e introduce un sovraccarico di manutenzione. Se il campo sorgente cambia frequentemente, i campi correlati memorizzati attivano molte ricalcolazioni. Utilizza i campi correlati memorizzati in modo selettivo, solo quando hai una necessità concreta di filtrare o raggruppare per essi in grandi set di dati.


Assumere che i campi ereditati rispettino le regole di accesso del modello figlio

I campi ereditati tramite delega vivono nel modello genitore. I diritti di accesso definiti sul modello figlio non si applicano automaticamente a quei campi a livello di database. Se limiti l'accesso al modello figlio ma non al genitore, gli utenti potrebbero comunque essere in grado di leggere i valori dei campi ereditati direttamente attraverso il modello genitore. Rivedi sempre le regole di sicurezza per entrambi i modelli quando utilizzi l'ereditarietà per delega.

Conclusione


I campi ereditati non sono una funzionalità di nicchia dello sviluppo Odoo. Sono integrati nell'architettura del sistema. La relazione tra utenti e partner, tra varianti di prodotto e modelli, tra ordini di vendita e informazioni di contatto dei clienti: tutte queste si basano sull'ereditarietà dei campi per mantenere i dati coerenti ed evitare duplicazioni.


Comprendere quale tipo di ereditarietà utilizzare, quando utilizzare un campo correlato invece, e come questi meccanismi si comportano nel database ti renderà un personalizzatore Odoo significativamente più efficace. Scriverai codice più pulito, progetterai modelli di dati migliori e trascorrerai meno tempo a fare debug del comportamento inaspettato dei campi.


Il concetto chiave è semplice: l'ORM di Odoo è progettato affinché i campi vivano in un unico posto e siano accessibili da molti. Questo è il principio alla base dei campi ereditati, ed è ciò che mantiene coerente il modello di dati di Odoo anche mentre cresce attraverso dozzine di moduli interconnessi.

Hai bisogno di aiuto con la tua implementazione di Odoo?


Da Dasolo, aiutiamo le aziende a implementare, personalizzare e ottimizzare Odoo. Che tu stia costruendo un modulo personalizzato da zero, estendendo modelli standard con nuovi campi, o cercando di capire perché il tuo modello di dati si comporta in modi inaspettati, il nostro team ha l'esperienza pratica di Odoo per aiutarti a muoverti più velocemente ed evitare errori costosi.


Se hai domande sul tuo modello di dati Odoo, sulla strategia dei campi personalizzati o sull'implementazione tecnica, saremo felici di discutere la tua situazione. Contattaci e troviamo l'approccio giusto per il tuo progetto.

Campi Ereditati in Odoo: Come l'ORM Condivide Dati tra i Modelli
Dasolo 6 marzo 2026
Condividi articolo
Accedi per lasciare un commento