Passa al contenuto

Campi Computati Salvati in Odoo: Guida Completa e Pratica

Scopri in modo pratico cosa sono i campi calcolati memorizzati in Odoo, quando conviene usarli e come crearli — sia scrivendo codice Python sia sfruttando Odoo Studio. In questa guida troverai spiegazioni chiare sui vantaggi delle memorizzazioni (performance, integrità dei dati), indicazioni su quando preferirli ai campi non memorizzati o ai campi relazionali, esempi concreti di implementazione e passaggi passo a passo per definire i compute fields memorizzati nel modello, gestire i trigger di aggiornamento e mantenere l’aggiornamento dei dati in scenari reali. Perfetto per sviluppatori Odoo e power user che vogliono ottimizzare le prestazioni e la coerenza delle informazioni.
6 marzo 2026 di
Campi Computati Salvati in Odoo: Guida Completa e Pratica
Dasolo
| Ancora nessun commento

Introduzione


Se hai lavorato con Odoo avrai notato campi il cui valore viene valorizzato automaticamente. Un campo calcolato memorizzato va oltre: la sua formula viene eseguita e il risultato viene salvato nella tabella del database, come se fosse un normale attributo del record.


Questa differenza ha conseguenze concrete. Un campo calcolato non memorizzato viene ricalcolato ogni volta che lo leggi e quindi non è efficiente da cercare, filtrare o raggruppare. Un campo calcolato memorizzato, invece, partecipa alle query SQL e può essere usato nelle viste, nei filtri e nelle esportazioni senza costi di calcolo dinamico.


Questa guida spiega tutto quello che serve sapere sui campi calcolati memorizzati in Odoo: il loro ruolo nel modello dati, come crearli con Odoo Studio o con codice Python, esempi pratici tratti da workflow reali e gli errori più frequenti da evitare.

Che cos'è un campo calcolato memorizzato in Odoo


Nell'ORM di Odoo ogni campo rappresenta un dato del modello. La maggior parte dei campi viene compilata dall'utente; un campo calcolato invece ottiene il suo valore da una funzione Python, non dall'inserimento manuale.


Un campo calcolato memorizzato è, in sostanza, lo stesso campo con l'aggiunta di store=True. Quando cambiano le sue dipendenze, Odoo esegue la funzione di calcolo e scrive il valore nella colonna del database, rendendolo disponibile come qualsiasi altro campo persistente.


In Python lo schema tipico è semplice e ripetibile:

total_amount = fields.Float(
    string='Total Amount',
    compute='_compute_total_amount',
    store=True,
)

@api.depends('quantity', 'unit_price')
def _compute_total_amount(self):
    for record in self:
        record.total_amount = record.quantity * record.unit_price

Il parametro store=True è il punto chiave: senza di esso il valore viene ricalcolato ad ogni lettura e non viene mai scritto sul database.


Nell'interfaccia utente un campo calcolato memorizzato non si distingue da un campo normale: appare nelle form, nelle liste e nei report, può essere usato per filtrare, raggruppare ed esportare. Non c'è un segnale visivo che indichi che il valore derivi da una formula.


Campi calcolati memorizzati vs non memorizzati

Capire questa differenza è fondamentale per qualunque intervento di sviluppo su Odoo:

  • Campo non memorizzato: il valore viene calcolato al volo quando lo leggi. Non è utilizzabile in filtri, ricerche o raggruppamenti nelle query SQL. Occupa meno spazio perché non serve una colonna persistente.
  • Campo memorizzato: il valore viene ricalcolato quando cambiano le dipendenze e scritto sul database. È ricercabile, filtrabile ed esportabile, ma occupa spazio come una normale colonna.

La scelta non è questione di migliore o peggiore: dipende dall'uso. Se serve solo per mostrare un valore su una form, il campo non memorizzato è spesso sufficiente. Se devi cercare, ordinare o aggregare per quel valore, occorre memorizzarlo.

Come funziona il campo


Quando definisci un campo memorizzato, l'ORM di Odoo crea in automatico i trigger di ricalcolo basandosi sui campi elencati nel decoratore @api.depends().


Ogni volta che una di queste dipendenze cambia su un record, Odoo segna il record come da ricalcolare, esegue la compute e scrive il risultato nella colonna del database corrispondente.


Il ciclo di ricalcolo

Ecco cosa succede, passo dopo passo:

  1. Un utente o un processo modifica un campo indicato in @api.depends().
  2. Odoo individua i record che dipendono da quel campo.
  3. Viene invocato il metodo di calcolo per quei record.
  4. Il valore calcolato viene salvato nella colonna del database.
  5. Da quel momento il campo è immediatamente utilizzabile per ricerca, filtro ed esportazione con il valore aggiornato.

Nella maggior parte dei casi il ricalcolo avviene subito nella stessa transazione; per operazioni massicce Odoo può invece differire parte dei ricalcoli e delegarli a job in background.


Dipendenze fra modelli correlati

Il decoratore @api.depends() accetta percorsi puntati per riferirsi a campi su modelli collegati. Per esempio:


@api.depends('partner_id.country_id.name')
def _compute_country_name(self):
    for record in self:
        record.country_name = record.partner_id.country_id.name or ''

In questo scenario Odoo traccia le modifiche su partner_id, country_id e name anche se appartengono a modelli diversi. Se il nome del paese cambia, tutti i record correlati verranno ricalcolati automaticamente: è una delle potenzialità più utili del framework Odoo.


Impatto sul database

Dal momento che il campo è memorizzato, Odoo crea davvero una colonna nella tabella PostgreSQL. Questo permette di usarlo direttamente nelle query SQL: le ricerche e i filtri diventano veloci ed efficienti come quelli sui campi standard.

Casi d'uso pratici in azienda


I campi calcolati memorizzati sono utili in molti ambiti. Ecco cinque esempi concreti tratti da processi aziendali reali.


1. Vendite: percentuale di margine sulle righe d'ordine

Il team commerciale vuole vedere subito il margine su ogni riga d'ordine. Un campo memorizzato prende prezzo di vendita e costo, calcola la percentuale e la salva: il responsabile può filtrare le righe per margine, identificare velocemente quelle non redditizie e raggruppare per fasce nei pivot.


2. CRM: giorni dall'ultima attività su un lead

Su un lead si può avere un campo memorizzato che conta i giorni trascorsi dall'ultima attività programmata. Abbinato a un'azione pianificata che forza il ricalcolo ogni mattina, la squadra commerciale può filtrare i lead inattivi senza monitoraggi manuali.


3. Magazzino: quantità netta disponibile

Per prodotti con regole di stock complesse è utile avere un valore pre-calcolato, ad esempio giacenza disponibile meno riservato. Poiché è memorizzato, i product manager possono ordinare e filtrare il catalogo senza far eseguire a Odoo pesanti calcoli di stock per ogni riga mostrata.


4. Contabilità: conteggio fatture scadute per cliente

Sul contatto cliente un campo memorizzato può contenere il numero di fatture attualmente scadute. L'area finanza può così ordinare i clienti per numero di scadenze arretrate con un clic: un'operazione possibile solo perché il conteggio è persistente nel database.


5. Produzione: durata totale stimata di un BOM

In una distinta base un campo memorizzato può sommare le durate stimate delle operazioni di lavoro. I planner possono filtrare e ordinare le BOM per tempo totale, utile per la pianificazione capacità; quando un'operazione viene aggiunta o modificata, il totale si aggiorna automaticamente.

Creare o personalizzare il campo


Per creare un campo memorizzato hai due strade principali: Odoo Studio per casi semplici o un modulo Python personalizzato per controllo completo.


Usare Odoo Studio

Odoo Studio permette di aggiungere campi calcolati senza toccare codice. Creando un campo di tipo Integer, Float o Monetary puoi attivare una formula che accetta espressioni simili a Python e Studio gestisce le dipendenze in automatico.


I campi calcolati creati con Studio sono ideali quando la logica è una semplice espressione aritmetica tra campi dello stesso record. Sono rapidi da configurare e non richiedono ambiente di sviluppo, ma mostrano limiti quando la logica coinvolge campi di modelli correlati, rami condizionali complessi o aggregazioni su record figli: in quei casi serve un modulo personalizzato.


Questa distinzione è importante nella pianificazione delle personalizzazioni: Studio è veloce per formule elementari, il codice Python è necessario quando la logica è complessa o richiede controllo totale.


Usare un modulo Python personalizzato

Per logiche avanzate definisci il campo in Python all'interno di un modulo Odoo personalizzato. Ecco un esempio concreto che aggiunge una percentuale di margine alle righe d'ordine:


from odoo import models, fields, api

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

    x_margin_pct = fields.Float(
        string='Margin %',
        compute='_compute_margin_pct',
        store=True,
        digits=(5, 2),
    )

    @api.depends('price_unit', 'purchase_price')
    def _compute_margin_pct(self):
        for line in self:
            if line.price_unit:
                line.x_margin_pct = (
                    (line.price_unit - line.purchase_price) / line.price_unit
                ) * 100
            else:
                line.x_margin_pct = 0.0

All'installazione del modulo Odoo crea la colonna x_margin_pct nel database, esegue il ricalcolo su tutti i record esistenti e inizia a tracciare le modifiche a price_unit e purchase_price da quel momento in poi.


Il prefisso x_ è la convenzione per i campi personalizzati in Odoo per evitare collisioni con campi core: una prassi consolidata nello sviluppo Odoo.


Rendere un campo calcolato modificabile dall'utente

Per impostazione predefinita i campi calcolati sono in sola lettura. Se vuoi permettere l'override manuale, puoi implementare un metodo inverse che viene chiamato quando l'utente scrive sul campo e aggiorna le fonti del calcolo. È utile quando il valore calcolato è un buon default ma talvolta va corretto a mano.


Campi Studio e API XML-RPC

Se gestisci campi tramite l'API XML-RPC puoi creare campi standard con il modello ir.model.fields. Tuttavia, per un campo calcolato memorizzato con logica custom il metodo di calcolo deve risiedere sul server in codice Python. L'approccio API serve per provisioning e automazione di campi semplici, ma la logica del compute richiede sempre un modulo installato sul server.

Buone pratiche


Di seguito le pratiche seguite dai consulenti Odoo esperti quando lavorano con campi calcolati memorizzati.


Dichiarare tutte le dipendenze in modo preciso

Il decoratore @api.depends() deve elencare ogni campo che il tuo metodo di calcolo legge. Se ne dimentichi anche uno, il campo non verrà aggiornato quando quella dipendenza cambia. Controlla il codice riga per riga e assicurati di includere ogni accesso a un campo.


Mantenere i metodi di compute veloci

Il metodo di compute viene eseguito per tutti i record interessati da una modifica di dipendenza; in sistemi intensi questo può tradursi in migliaia di record. Evita query aggiuntive dentro il compute quando possibile: sfrutta i campi già caricati e limita le chiamate al database.


Usare store=True solo quando necessario

I campi memorizzati occupano spazio e causano scritture ogni volta che vengono ricalcolati. Se il campo serve solo per mostrare un valore e non per cercare o raggruppare, la versione non memorizzata è più leggera. Decidi consapevolmente, non dare per scontato il valore memorizzato.


Gestire i casi limite nel metodo di calcolo

Prevedi sempre valori mancanti o situazioni anomale nel compute: divisioni per zero, record correlati assenti o valori nulli generano errori o risultati sbagliati. Inserisci controlli espliciti e valori di fallback sicuri.


Pianificare il ricalcolo iniziale su tabelle grandi

Quando installi un modulo che aggiunge un campo memorizzato, Odoo ricalcola il valore per tutti i record esistenti. Su tabelle con centinaia di migliaia di righe questo può richiedere tempo: testa la migrazione in staging e pianifica downtime o ricalcoli background per la produzione.


Evitare dipendenze circolari

Se il campo A dipende dal campo B e il campo B dipende dal campo A, Odoo segnala un errore al caricamento del modulo. Progetta le dipendenze in modo che fluiscano in una sola direzione.

Errori comuni


Dimenticare store=True

Questo è l'errore più frequente. Il campo appare correttamente in form e durante i test tutto sembra ok, poi qualcuno prova a usarlo in un filtro o in un report e non funziona. Prima di scrivere il codice decidi se il campo deve essere ricercabile; in tal caso imposta subito store=True.


Dipendenza mancante in @api.depends

Se il metodo legge partner_id.country_id ma il decoratore indica solo partner_id, il campo non si aggiornerà quando cambia il paese del partner. Traccia l'intero percorso di ogni accesso e dichiara ogni tappa nel decoratore.


Errori silenti nel metodo di compute

Se il compute solleva un'eccezione per un record, Odoo salta silenziosamente il ricalcolo per quel record e mantiene il valore memorizzato precedente. L'errore può apparire nei log ma l'utente non lo vede, portando a valori obsoleti o errati. Testa il compute su record con dati mancanti o anomali.


Degrado di performance su dataset grandi

Un compute che va bene in sviluppo può diventare un collo di bottiglia in produzione se la tabella cresce. Controlla quante query aggiuntive il tuo compute esegue per record: anche una singola query extra moltiplicata per decine di migliaia di record è un problema.


Uso di sudo() dentro i compute

Chiamare sudo() nel compute per bypassare i diritti è un rischio: potresti esporre dati che l'utente non dovrebbe vedere. Usa sudo() solo dopo aver valutato attentamente le implicazioni di sicurezza.


Aspettarsi ricalcolo immediato in ogni contesto

In molte operazioni interattive il ricalcolo è sincrono, ma in import massivi, job in background o in operazioni ORM con certi flag di contesto il ricalcolo può essere differito. Non progettare logiche di business che si basino sull'immediatezza del valore memorizzato senza verificarne il comportamento nel contesto d'uso.

Conclusione


I campi calcolati memorizzati sono strumenti molto potenti per estendere Odoo: automatizzano calcoli, mantengono dati coerenti e rendono le informazioni ricercabili ed esportabili senza lavoro manuale.


Punti chiave da tenere a mente:

  • Usa store=True solo quando il campo deve essere ricercabile, filtrabile o esportabile.
  • Dichiara sempre tutte le dipendenze in @api.depends(), incluse quelle che attraversano modelli.
  • Mantieni i metodi di compute efficienti e gestisci esplicitamente i casi limite.
  • Per formule semplici Studio è una soluzione rapida; per logiche complesse scrivi Python.
  • Pianifica il ricalcolo iniziale quando distribuisci su tabelle con molti record.

Che tu stia sviluppando un nuovo modulo personalizzato, estendendo un modello esistente o esplorando i tipi di campo in Odoo, i campi calcolati memorizzati meritano una comprensione approfondita: sono il punto d'incontro tra ORM, database e logica di business.


Hai bisogno di aiuto con la tua implementazione Odoo?

Dasolo supporta le aziende nell'implementazione, personalizzazione e ottimizzazione di Odoo per esigenze diverse. Se devi aggiungere campi calcolati al modello dati, costruire report basati su valori calcolati o portare avanti lo sviluppo Odoo, il nostro team ha l'esperienza necessaria.


Contattaci per discutere il tuo caso: valutiamo insieme la soluzione più adatta al tuo business e ti aiutiamo a implementarla.

Campi Computati Salvati in Odoo: Guida Completa e Pratica
Dasolo 6 marzo 2026
Condividi articolo
Accedi per lasciare un commento