Als je al eens in Odoo hebt geïnstalleerd of geconfigureerd, ben je ongetwijfeld filters tegengekomen die eruitzien als korte Python-achtige statements tussen vierkante haken. Die voorwaarden verschijnen overal: in actieknoppen, automatische regels, record rules en e-mailsjablonen. Minder bekend is dat Odoo hiervoor een speciaal veldtype aanbiedt — het Domain-veld — dat deze filteruitdrukkingen opslaat als gestructureerde gegevens en een gebruiksvriendelijke editor levert.
Of je nu ontwikkelaar bent die modules bouwt of een functioneel beheerder die workflows instelt: inzicht in Domain-velden is nuttig. In deze gids leggen we uit wat er precies in zo’n veld bewaard wordt, hoe het technisch werkt en welke valkuilen je best vermijdt bij gebruik in productieomgevingen.
Wat is het Domain-veld in Odoo
In Odoo is een domain in essentie een verzameling filtervoorwaarden die bepalen welke records bij een zoekopdracht worden teruggegeven. De notatie bestaat uit tupels en logische operatoren en wordt bij uitvoering door de ORM vertaald naar SQL WHERE-voorwaarden.
Een voorbeeld van zo’n expressie
[('customer_rank', '>', 0), ('active', '=', True)]
In gewone woorden: geef alle records terug waarvan customer_rank groter is dan 0 en waarvan active de waarde True heeft.
Het Domain-veld (fields.Domain) is een veldtype in de Odoo ORM dat zulke expressies bewaart als gestructureerde data. In tegenstelling tot een gewone tekstkolom bevat het validatielogica en koppelt het een specifieke UI-widget waarmee gebruikers visueel filters kunnen samenstellen zonder code te schrijven.
Hoe het in de interface verschijnt
In de gebruikersinterface toont het Domain-veld standaard de domain-editor: een visuele bouwer waar je een veld kiest, een operator selecteert (is gelijk aan, bevat, groter dan, enz.) en een waarde invult. Het is dezelfde builder die je ook ziet bij toegangregels, automatische acties en filterconfiguraties.
Op databaseniveau worden domain-waarden als tekst opgeslagen — concreet als de stringrepresentatie van een Python-lijst. Het veld zorgt voor serialisatie en validatie, zodat ontwikkelaars in Python met nette domain-waarden werken terwijl de opslaglaag de rest afhandelt.
Dit illustreert een groter ontwerpprincipe in Odoo: een veld is meer dan enkel opslag. Het definieert ook hoe data zich gedraagt in de UI en welke controle er op toegepast wordt.
Hoe het veld werkt
De integratie met de ORM en filtermechanismen
Wat gebeurt er precies als je een domain opslaat, en hoe wordt het later geëvalueerd?
Opslag en representatie
Bij het wegschrijven bewaart Odoo het domain als een geserialiseerde tekst. Variabelen zoals uid worden pas bij het uitvoeren vervangen door de actuele gebruikers-ID, wat dynamische filters mogelijk maakt zonder vaste waarden in de configuratie te verankeren. Odoo gebruikt vervolgens een gecontroleerde eval-methode (safe_eval) om de string om te zetten naar interne representaties en uiteindelijk naar SQL WHERE-voorwaarden.
De domain-widget
In de UI gebruikt het Domain-veld standaard de domain-widget: een visuele filterbouwer waarmee gebruikers condities kunnen toevoegen, combineren met EN/OF-logica en zelfs resultaten kunnen previewen — allemaal zonder een regel code te typen.
Die visuele laag is wat domain-velden toegankelijk maakt voor zakelijke gebruikers: je hoeft geen domain-syntax te kennen om een betrouwbare filter te maken.
Modelcontext
Een Domain-veld kan gekoppeld worden aan een specifiek model zodat de widget weet welke velden beschikbaar zijn in de builder. Die koppeling gebeurt via de model_field-optie in de velddefinitie. Zonder deze context valt de widget terug op een simpele tekstbox, wat minder bruikbaar is voor eindgebruikers.
Deze contextbinding is een kernprincipe van het Odoo-framework: velddefinities sturen zowel gedrag in de UI als welke opties beschikbaar zijn.
Interactie met andere records
Domain-velden worden vaak gecombineerd met relationele velden: bijvoorbeeld om de opties in een Many2one-dropdown te beperken, om het bereik van een automatische actie te definiëren of om de scope van een rapport af te bakenen. Omdat de filter op ORM-niveau werkt, respecteert hij ook de Odoo-beveiligingsregels en toegangsrechten.
Praktische bedrijfsvoorbeelden
Waar je domain-velden in de praktijk tegenkomt
1. Automatiseringen en e-mailtriggers
Bij het instellen van een automatische actie definieer je een domain dat bepaalt welke records de actie triggert. Een herinneringsmail voor vervallen facturen richt zich bijvoorbeeld enkel op geposte, onbetaalde facturen die voorbij de vervaldatum zijn — dat filter wordt opgeslagen op het base.automation-record in een Domain-veld genaamd filter_domain.
2. Record rules en toegangscontrole
Record rules gebruiken domain-expressies om te bepalen welke records een bepaalde gebruikersgroep mag zien of bewerken. Zo kun je rijniveau-beveiliging instellen (bijvoorbeeld: enkel records die aan het team van de gebruiker zijn toegewezen) zonder maatwerkcode. Elke filter in een record rule is een domain-uitdrukking die in een Domain-veld staat.
3. Voorraad- en logistieke filters
In magazijnprocessen worden domains ingezet om reorders, geplande acties of inventarischecks te beperken tot bepaalde productcategorieën, locaties of voorraadniveaus. Daardoor vermijd je dat automatische processen duizenden irrelevante records moeten doorlopen.
4. CRM-pijplijn en lead-kwalificatie
In CRM worden domains gebruikt om leads te categoriseren en automatisch toe te wijzen. Bijvoorbeeld: leads uit een bepaald land of sector worden via een domain gekoppeld aan de juiste verkoopmedewerker. Dankzij het Domain-veld kun je zulke regels vanuit de interface beheren zonder steeds code te moeten aanpassen.
5. Dynamische Many2one-keuzelijsten
Op formulieren kun je met een domain de records filteren die in een Many2one-dropdown verschijnen. Zo toon je bijvoorbeeld enkel actieve leveranciers met een supplier-rang > 0. Domains kunnen bovendien dynamisch verwijzen naar andere velden op het formulier, waardoor de keuzelijst meeverandert met gebruikersinvoer.
Een Domain-veld aanmaken of aanpassen
Manieren om met Domain-velden te werken
Er zijn twee veelgebruikte paden: visueel via Odoo Studio voor no-code aanpassingen, of technisch via Python/XML in een maatwerkmodule.
Werken met Odoo Studio
Odoo Studio biedt geen apart visueel Domain-veld in zijn veldkeuze, maar voor de meeste configuraties is dat niet nodig. De ingebouwde domain-editors in automatiseringen en record rules geven je al een visuele builder. Wil je een domain aan een Many2one op een formulier toevoegen, dan pas je dat in Studio aan via de veldinstellingen; Studio valideert de syntaxis en slaat het domain op in de viewdefinitie.
Technische aanpassingen in Python
In een custom module voeg je een Domain-veld toe via de ORM. Dat is rechttoe rechtaan en goed gedocumenteerd in de ontwikkelaarsgids.
Voorbeeld (conceptueel)
Je koppelt de model_field aan een veld dat de modelnaam bevat, zodat de domain-widget weet welke velden in de builder beschikbaar moeten zijn. Zo kun je zelfs het targetmodel dynamisch laten wisselen indien de use case dat vereist.
De widget in een view tonen
Om de domain-editor zichtbaar te maken in een formulier moet je zowel het modelnaamveld als het domain-veld in de view opnemen, en de widgetoptie meegeven.
<field name="model_name" invisible="1"/>
<field name="filter_domain" widget="domain"
options="{'model': 'model_name'}"/>
Zonder widget="domain" en de modeloptie verschijnt het veld als tekstinvoer. Voeg ze dus altijd toe wanneer je gebruikers visuele domain-configuratie wilt geven.
Domain waarden via XML-RPC schrijven
Wanneer je via de API een Domain-veld vult, stuur de waarde altijd als string.
models.execute_kw(db, uid, api_key, 'my.model', 'write',
[[record_id], {
'filter_domain': "[('active', '=', True)]"
}]
)
Een veelgemaakte fout is een Python-lijst doorgeven in plaats van een string: dat veroorzaakt typefouten of stilzwijgende mislukking afhankelijk van de Odoo-versie. Seriële strings gebruiken voorkomt die problemen.
Aanbevolen werkwijzen
Praktische gewoontes die tijd besparen
Valideer domains voor uitrol
Een ongeldige domain-expressie leidt direct tot fouten zodra Odoo deze moet evalueren. Test domains in de zoekbalk of via developer mode, of gebruik een search_count-oproep via de API om te controleren of de filter het verwachte aantal records teruggeeft.
Gebruik dynamische variabelen
Vermijd harde ID’s of statische datums in domains. Gebruik variabelen zoals uid, context_today() of current_company_id zodat filters ook na migraties of in andere omgevingen blijven werken.
Bind altijd de modelcontext
Bij het toevoegen van een Domain-veld aan een model: vergeet niet de model_field te zetten en op te nemen in de view. Zonder die koppeling biedt de builder niet de slimme velden en daalt de gebruiksvriendelijkheid.
Houd domains leesbaar
Zeer geneste domains met veel OR/AND-operators worden snel onoverzichtelijk. Documenteer in je code waarom een domain op die manier is opgebouwd. Als het te complex wordt, overweeg dan een serveractie of een berekend veld dat de logica beter structureert en testbaar maakt.
Gebruik safe_eval voor evaluatie in code
Wanneer je domain-strings in Python-evaluaties gebruikt, maak altijd gebruik van Odoo’s safe_eval in plaats van de standaard eval. safe_eval behandelt Odoo-contextvariabelen correct en is veiliger en consistenter met de interne werkwijze.
Test met realistische data
Controleer altijd of een domain de juiste records teruggeeft voordat je het live zet, zeker bij automatiseringen en record rules. Een foutief filter kan onbedoeld records verwerken of toegang blokkeren zonder duidelijke foutmelding.
Veelvoorkomende valkuilen
Veelvoorkomende fouten en hoe ze te vermijden
Verwarring tussen het veldtype en de filtersyntax
In Odoo betekent “domain” twee dingen: de filterlogica zelf en het veldtype (fields.Domain) dat die logica opslaat. Nieuwkomers verwarren die twee soms. Onthoud: het Domain-veld is de opslag, de domain-expressie is de inhoud.
Een lijst doorgeven in plaats van een string via de API
Bij schrijven via XML-RPC moet je een string sturen. Stuur je een echte Python-lijst, dan krijg je fouten of geen effect — serialiseer je domain altijd naar tekst.
Ontbrekende modelcontext in de widget
Zonder modelcontext in de widgetopties zie je geen visuele builder maar enkel een tekstveld. Zorg dat de model_field-koppeling in de view staat, anders verliezen gebruikers comfort en validatie.
Hardcoded record-ID’s in domains
Domains die rechtstreeks naar specifieke record-ID’s verwijzen breken zodra die records verwijderd worden of bij databasekopieën. Gebruik dynamische verwijzingen zoals uid of relationele lookups voor draagbaarheid.
Te brede of te strikte record rules
Een te ruim domain in een record rule kan toegang verschaffen tot records die niet zichtbaar mogen zijn; te restrictieve rules kunnen records verbergen zonder waarschuwing. Test altijd vanuit het gebruikersprofiel waarop de regel van toepassing is, niet als admin.
Vergeten van gearchiveerde records
Standaard sluit Odoo gearchiveerde records uit (waar active = False). Als je ze wilt meenemen, voeg dan expliciet ('active', 'in', [True, False]) toe aan je domain.
Samenvatting
Domain-velden zitten overal in Odoo en vormen de ruggengraat van hoe records gefilterd worden: van toegangscontrole en automatiseringen tot dynamische dropdowns en dashboards. Het veldtype fields.Domain biedt een gevalideerde, nette manier om die filters in het datamodel op te slaan en te tonen.
Voor zakelijke gebruikers maakt de domain-widget filterconfiguratie mogelijk zonder code. Voor ontwikkelaars brengt het Domain-veld duidelijkheid waar vroeger vaak een generieke Char met widgetoverride werd gebruikt. Of je nu in Odoo Studio werkt, een Python-module bouwt of workflows via de UI instelt: begrijpen hoe domain-velden werken opent veel nieuwe mogelijkheden.
De principes in deze gids gelden over Odoo-versies en modules heen. Tijd investeren in goed begrip van domain-velden betaalt zich vaak terug, want je komt ze overal tegen in een volwassen Odoo-omgeving.
Hulp nodig met je Odoo-implementatie?
Dasolo ondersteunt bedrijven bij het implementeren, aanpassen en optimaliseren van Odoo voor hun specifieke processen. Of het nu gaat om automatiseringen, maatwerkmodules of het efficiënter benutten van een bestaande installatie: ons team heeft de technische kennis om je met vertrouwen verder te helpen.
Heb je vragen over Domain-velden of andere onderdelen van je Odoo-opstelling, neem contact met ons opvoor een vrijblijvend advies. We bekijken graag je configuratie en geven praktische aanbevelingen.