Se hai trascorso del tempo a configurare Odoo, probabilmente ti sei imbattuto in espressioni di dominio. Quelle condizioni di filtro piene di parentesi appaiono nei pulsanti di azione, nelle regole automatizzate, nelle regole di registrazione e nei modelli di email in tutta la piattaforma. Ma in pochi si rendono conto che Odoo fornisce anche un tipo di campo Dominio nel suo ORM, progettato specificamente per memorizzare e visualizzare queste espressioni come dati strutturati.
Comprendere i campi dominio è importante sia che tu sia uno sviluppatore Odoo che costruisce moduli personalizzati, sia un utente aziendale che configura flussi di lavoro automatizzati. Questa guida copre tutto, da cosa memorizza effettivamente un campo dominio a esempi pratici, suggerimenti per lo sviluppo e gli errori più comuni da evitare.
Cos'è il campo Dominio in Odoo
In Odoo, un dominio è un elenco di condizioni di filtro utilizzate per interrogare i record. Segue una sintassi specifica utilizzando tuple e operatori logici, e si mappa direttamente alle clausole SQL WHERE quando Odoo esegue una query sul database.
Un'espressione di dominio tipica appare così:
[('customer_rank', '>', 0), ('active', '=', True)]
Questo si traduce in: restituisci tutti i record in cui customer_rank è maggiore di 0 E active è True.
Il campo Domain (fields.Domain) è un tipo di campo nell'Odoo ORM che memorizza queste espressioni come dati strutturati all'interno di un record. A differenza di un campo di testo semplice, viene fornito con una validazione integrata e un widget UI dedicato che consente agli utenti di costruire condizioni di filtro visivamente, senza scrivere alcun codice.
Come appare nell'interfaccia
Nell'interfaccia Odoo, un campo Domain viene visualizzato utilizzando il widget dell'editor di dominio per impostazione predefinita. Questo widget presenta un costruttore di regole visive in cui gli utenti possono scegliere un campo, selezionare un operatore (uguale, contiene, maggiore di, e così via) e inserire un valore. È la stessa interfaccia che vedi quando configuri le regole di accesso o i criteri di filtro nelle azioni automatizzate.
Nel database, i valori di dominio sono memorizzati come testo semplice, specificamente come la rappresentazione stringa di una lista Python. Il tipo di campo gestisce la serializzazione e la validazione in modo trasparente, quindi gli sviluppatori lavorano con valori di dominio puliti in Python mentre il livello di archiviazione gestisce il resto.
Questo fa parte del più ampio design del modello dati Odoo: i campi non sono solo contenitori di archiviazione. Portano significato semantico, comportamento UI e logica di validazione insieme in una singola definizione.
Come funziona il campo
Il campo Domain si integra strettamente con l'ORM Odoo e il sistema di filtraggio dei record. Ecco cosa succede sotto il cofano quando salvi e valuti un dominio.
Archiviazione e rappresentazione
Quando un dominio viene salvato nel database, Odoo lo memorizza come una stringa serializzata. Un dominio che restringe i record allo stato di bozza per l'utente corrente è memorizzato come un valore di testo che Odoo valuta al momento della query. La variabile speciale uid viene risolta nell'ID utente corrente a runtime, rendendo possibile il filtraggio dinamico senza hardcoding di valori.
L'ORM Odoo prende quella stringa, la valuta in modo sicuro e la converte in una clausola SQL WHERE. Questa valutazione avviene tramite safe_eval, che supporta un sottoinsieme controllato di espressioni Python insieme a variabili di contesto specifiche di Odoo.
Il widget di dominio
Nell'interfaccia Odoo, i campi di tipo fields.Domain utilizzano il widget di dominio per impostazione predefinita. Questo widget presenta il costruttore di filtri che vedi in molte parti di Odoo. Gli utenti possono aggiungere condizioni, combinarle con logica AND o OR e visualizzare i risultati senza toccare alcun codice.
Il widget è ciò che rende i campi di dominio realmente accessibili agli utenti aziendali. Non è necessario comprendere la sintassi del dominio per configurare un filtro. Il costruttore visivo gestisce la traduzione per te.
Contesto del modello
Un campo di dominio può essere collegato a un modello specifico, che indica a Odoo quali campi offrire nel costruttore di dominio. Imposti questo tramite l'attributo model_field nella definizione del campo. Senza un contesto di modello, il widget di dominio torna a un input di testo semplice, che è molto meno utile per gli utenti finali.
Questo legame di contesto è una parte fondamentale di come il framework Odoo collega le definizioni dei campi al comportamento dell'interfaccia utente. Il campo conosce il modello che filtra e l'interfaccia si adatta di conseguenza.
Interazione con altri record
I campi di dominio vengono spesso utilizzati insieme ai campi relazionali per limitare quali record appaiono in un menu a discesa Many2one, per definire quali record un'azione automatizzata mira, o per impostare l'ambito di un report o di un dashboard. L'espressione di dominio agisce come un filtro attivo applicato a livello ORM, il che significa che rispetta le regole di sicurezza di Odoo e i controlli di accesso ai campi.
Casi d'uso aziendali
I campi di dominio appaiono in praticamente ogni modulo di Odoo. Ecco cinque esempi del mondo reale che mostrano come guidano flussi di lavoro aziendali pratici.
1. Azioni automatizzate e attivatori di email
Quando configuri un'azione automatizzata in Odoo (Impostazioni > Tecnico > Automazione), definisci un dominio per specificare quali record attivano l'azione. Ad esempio, un'email automatizzata per fatture scadute potrebbe mirare solo a fatture registrate che sono non pagate e oltre la loro data di scadenza. Questo dominio è memorizzato direttamente nel modello base.automation in un campo di dominio chiamato filter_domain. L'azione si attiva solo per i record che corrispondono.
2. Regole di record e controllo accessi
Le regole di sicurezza dei record di Odoo utilizzano i campi di dominio per limitare quali record un gruppo di utenti può vedere o modificare. Una regola per il team di vendita potrebbe limitare la visibilità ai record assegnati al team dell'utente corrente, valutata al momento della query. Questo ti offre sicurezza a livello di riga senza scrivere codice personalizzato. Ogni filtro su ogni regola di record in Odoo è un'espressione di dominio memorizzata in un campo di dominio.
3. Filtraggio di inventario e operazioni
Nella gestione del magazzino e dell'inventario, le azioni programmate e le regole di riordino utilizzano i domini per mirare a specifiche categorie di prodotti, posizioni o livelli di stock. Un'azione di riapprovvigionamento automatizzata può essere limitata ai prodotti stoccabili con quantità disponibile pari o inferiore a un punto di riordino, evitando elaborazioni non necessarie su migliaia di record.
4. Pipeline CRM e qualificazione dei lead
Nel modulo CRM, l'automazione delle fasi della pipeline, le regole di attività e l'assegnazione dei lead si basano tutte su espressioni di dominio per categorizzare e qualificare i lead. Le regole di assegnazione dei lead personalizzate utilizzano i domini per abbinare i lead al giusto venditore in base a paese, settore o dimensione dell'affare. Il campo dominio è ciò che rende queste regole configurabili dall'interfaccia piuttosto che richiedere modifiche al codice per ogni nuovo scenario.
5. Dropdown Many2one dinamici
Nei moduli personalizzati, un dominio applicato a un campo Many2one controlla quali record appaiono nel menu a discesa. Limitare un campo fornitore per mostrare solo fornitori attivi con un punteggio fornitore diverso da zero crea esperienze utente più mirate e riduce gli errori di input. Il dominio può essere persino dinamico, facendo riferimento ai valori di altri campi nello stesso modulo, rendendo le opzioni disponibili variabili in base alle selezioni dell'utente.
Creazione o personalizzazione del campo
Ci sono due approcci principali per lavorare con i campi Dominio in Odoo: utilizzare Odoo Studio per personalizzazioni senza codice, oppure scrivere Python e XML in un modulo personalizzato.
Utilizzando Odoo Studio
Odoo Studio attualmente non espone un tipo di campo Dominio autonomo nel suo creatore di campi visivi. Per la maggior parte delle esigenze di configurazione aziendale, non ne hai bisogno. Gli editor di dominio esistenti integrati in azioni automatizzate, regole di record e azioni server ti offrono il costruttore di dominio visivo senza richiedere un campo personalizzato.
Se desideri aggiungere un filtro di dominio a un campo Many2one in un modulo, puoi farlo in Studio modificando le proprietà del campo e inserendo direttamente un'espressione di dominio. Studio convalida la sintassi del dominio e la memorizza nella definizione della vista.
Personalizzazione tecnica in Python
In un modulo Odoo personalizzato, aggiungere un campo Dominio è una parte semplice della guida per sviluppatori di odoo standard. Ecco un esempio base utilizzando l'ORM:
from odoo import models, fields
class MyModel(models.Model):
_name = 'my.model'
model_name = fields.Char(default='res.partner')
filter_domain = fields.Domain(
string='Filter Domain',
model_field='model_name',
help='Domain expression to filter partner records'
)
L'attributo model_field collega l'editor del dominio al nome del modello memorizzato in model_name. Questo indica al widget del dominio quali campi offrire nel builder visivo. Mantenere il nome del modello in un campo separato consente anche una selezione dinamica del modello se il tuo caso d'uso lo richiede.
Aggiungere il widget a una vista modulo
Per visualizzare il builder del dominio in una vista modulo, fai riferimento sia al campo modello che al campo dominio nel XML della vista:
<field name="model_name" invisible="1"/>
<field name="filter_domain" widget="domain"
options="{'model': 'model_name'}"/>
Senza la dichiarazione widget="domain" e l'opzione modello, il campo viene visualizzato come testo normale. Includi sempre entrambi quando costruisci moduli che espongono la configurazione del dominio agli utenti.
Scrivere valori di dominio tramite l'API XML-RPC
Se stai impostando valori di campo dominio programmaticamente tramite l'API, passa sempre il valore come stringa:
models.execute_kw(db, uid, api_key, 'my.model', 'write',
[[record_id], {
'filter_domain': "[('active', '=', True)]"
}]
)
Passare un oggetto lista Python invece di una stringa è un errore comune che causa errori o fallimenti silenziosi a seconda della versione di Odoo. Serializza sempre il tuo dominio in una stringa prima di scriverlo tramite l'API.
Migliori pratiche
Queste abitudini pratiche ti faranno risparmiare tempo e prevenire problemi quando lavori con i campi dominio in Odoo.
Valida la sintassi del dominio prima di distribuire
Un'espressione di dominio non valida solleva errori nel momento in cui Odoo cerca di valutarla. Testa i tuoi domini nella barra di ricerca di Odoo o in modalità sviluppatore prima di salvarli in azioni automatizzate o regole di registrazione. Una rapida chiamata search_count tramite l'API è anche un modo affidabile per confermare che un dominio restituisca il numero atteso di record.
Utilizza variabili dinamiche dove possibile
Evita di hardcodare ID utente, ID azienda o date nelle espressioni di dominio. Utilizza variabili dinamiche come uid, context_today() e current_company_id invece. Questo mantiene i tuoi domini portabili e evita rotture silenziose quando i record cambiano tra gli ambienti.
Collega sempre il contesto del modello
Quando aggiungi un campo di Dominio a un modello personalizzato, imposta sempre l'attributo model_field e includilo nella vista. Senza di esso, gli utenti vedono un input di testo semplice invece del costruttore di dominio visivo, il che riduce l'usabilità e aumenta la possibilità che vengano salvati valori non validi.
Mantieni i domini leggibili
I domini complessi annidati che utilizzano gli operatori | (OR) e & (AND) possono diventare difficili da leggere e mantenere. Aggiungi commenti nel tuo codice Python che spiegano l'intento dietro ogni dominio. Se un dominio diventa molto complesso, considera se un'azione del server o un campo calcolato sarebbero più chiari e più facili da testare.
Utilizza safe_eval per la valutazione programmatica
Quando valuti stringhe di dominio nel codice Python, ad esempio all'interno di un'azione del server o di un'azione automatizzata, utilizza safe_eval integrato in Odoo piuttosto che eval nativo di Python. È più sicuro, gestisce correttamente le variabili di contesto specifiche di Odoo ed è coerente con il modo in cui Odoo valuta i domini internamente.
Testa con dati realistici
Verifica sempre che il tuo dominio corrisponda ai record attesi prima di andare in produzione. Questo è particolarmente importante per le azioni automatizzate e le regole di record, dove un filtro errato può elaborare i record sbagliati o bloccare l'accesso degli utenti senza alcun avviso visibile.
Trappole comuni
Ecco gli errori che si presentano più spesso quando si lavora con i campi di dominio in Odoo e come evitarli.
Confondere il tipo di campo con la sintassi del dominio
La parola "dominio" ha due significati diversi in Odoo. Si riferisce alla sintassi del filtro (un elenco di tuple) e si riferisce anche a fields.Domain, un tipo di campo ORM specifico che memorizza quelle espressioni come dati. I neofiti della personalizzazione di Odoo spesso confondono i due. Un campo Domain è un contenitore di archiviazione. L'espressione di dominio è la logica di filtro al suo interno.
Passare un elenco invece di una stringa tramite l'API
Quando si scrive in un campo Domain tramite XML-RPC, è necessario passare una stringa, non un oggetto lista Python. Passare il dominio come un elenco grezzo causerà un errore di tipo o un silenzioso fallimento a seconda della versione di Odoo. Serializza sempre il tuo dominio in una stringa prima di scriverlo tramite l'API.
Mancanza di contesto del modello sul widget
Se aggiungi un campo Domain a una vista modulo senza specificare il contesto del modello nelle opzioni del widget, gli utenti vedranno un input di testo semplice anziché il costruttore di dominio visivo. Il costruttore di dominio appare solo quando il widget sa a quale modello fare riferimento. Includi sempre il link model_field nella tua definizione di vista.
Codifica fissa degli ID dei record nei domini
I domini che fanno riferimento direttamente a ID di record specifici si rompono silenziosamente quando quei record vengono eliminati o quando copi la configurazione in un nuovo database. Utilizza riferimenti dinamici come uid o ricerche relazionali ovunque sia possibile per mantenere i tuoi domini portabili.
Domini delle regole di record troppo ampi o restrittivi
Un dominio di regola di record che è troppo permissivo può esporre record a utenti che non dovrebbero vederli. Uno che è troppo restrittivo può nascondere silenziosamente record senza alcuna spiegazione per l'utente. Testa sempre i domini delle regole di record dalla prospettiva del gruppo di utenti target, non dall'account admin che bypassa tutte le regole.
Dimenticare i record archiviati
Per impostazione predefinita, Odoo esclude i record archiviati (dove active = False) dai risultati di ricerca. Se il tuo dominio non tiene conto di questo, potresti ottenere lacune inaspettate nei tuoi dati. Aggiungi ('active', 'in', [True, False]) quando hai bisogno di includere i record archiviati nei risultati del filtro.
Conclusione
I campi Domain sono uno di quei mattoni che alimentano silenziosamente gran parte di come funziona Odoo. Dal controllo degli accessi e azioni automatizzate a menu a discesa dinamici e filtri della dashboard, le espressioni di dominio sono la spina dorsale del filtraggio dei record in Odoo, e il tipo fields.Domain offre agli sviluppatori un modo pulito e convalidato per memorizzare e presentare quella logica direttamente nel modello dati di Odoo.
Per gli utenti aziendali, il widget dominio rende la configurazione dei filtri accessibile senza alcun codice. Per gli sviluppatori, il tipo di campo Dominio porta chiarezza alle definizioni dei modelli che prima si basavano su campi Char generici con un override del widget. Che tu stia lavorando in Odoo Studio, scrivendo un modulo Python personalizzato o configurando flussi di lavoro automatizzati dall'interfaccia, comprendere come funzionano i campi dominio apre una vasta gamma di possibilità.
I concetti trattati in questa guida si applicano a tutte le versioni e moduli di Odoo. Il tempo speso per comprendere i campi dominio è tempo ben investito, perché sono veramente ovunque in Odoo.
Hai bisogno di aiuto con la tua implementazione di Odoo?
Dasolo aiuta le aziende a implementare, personalizzare e ottimizzare Odoo per le loro specifiche esigenze aziendali. Che tu stia impostando flussi di lavoro automatizzati, costruendo moduli personalizzati o cercando di ottenere di più dalla tua configurazione Odoo esistente, il nostro team ha la competenza tecnica per aiutarti a progredire con fiducia.
Se hai domande sui campi Dominio o su qualsiasi altro aspetto della tua implementazione di Odoo, contattaci. Siamo felici di dare un'occhiata alla tua configurazione e indirizzarti nella giusta direzione.