Skip to Content

Domain Fields i Odoo: Den Komplette Guide for Udviklere and Brugere

Få styr på, hvordan feltet “Domain” fungerer i Odoo, hvor du møder det i systemet, og hvordan du anvender det i dine datamodeller og tilpasninger. Lær hvornår du skal bruge domains til at filtrere poster, begrænse valg i relationer eller bygge logik, og få praktiske tips til syntaks, variable og hyppige faldgruber, så dine tilpasninger bliver robuste og vedligeholdelsesvenlige.
6. marts 2026 af
Domain Fields i Odoo: Den Komplette Guide for Udviklere and Brugere
Dasolo
| Ingen kommentarer endnu

Hvis du har arbejdet med Odoo, har du sikkert set række filtre med parenteser og tuples overalt i systemet. De dukker op i automatiseringer, adgangsregler og skabeloner — men få bemærker, at Odoo også har et egentligt felt-type til netop disse udtryk: et Domain-felt, bygget til at gemme og vise filterudtryk som strukturerede data i systemets ORM.


At kende Domain-feltet er relevant både for udviklere, der bygger tilpassede moduler, og for forretningsbrugere, der opsætter arbejdsprocesser. Denne guide forklarer, hvad feltet gemmer, hvordan det bruges i praksis, hvordan du implementerer det teknisk, og hvilke fejl du skal undgå.

Hvad er et Domain-felt i Odoo


I Odoo er en domain en samling filterbetingelser, der bruges til at søge i poster. Den har en særlig syntaks med tuples og logiske operatorer og omsættes af ORM’en til de tilsvarende SQL WHERE-klausuler, når databasen spørges.

Et typisk domain-udtryk kan se sådan ud:


[('customer_rank', '>', 0), ('active', '=', True)]

I praksis betyder det: find alle poster hvor customer_rank er større end 0 OG active er True.


Domain-feltet (fields.Domain) er en felt-type i Odoo’s ORM, skabt til at gemme netop disse filterudtryk. I modsætning til et almindeligt tekstfelt tilbyder det validering og en dedikeret brugerflade, så forretningsbrugere kan bygge filtre visuelt uden at skrive kode.


Hvordan det vises i brugerfladen

I Odoo vises Domain-feltet typisk med domæne-editoren. Den giver en visuel builder, hvor man vælger felt, vælger operator (lig med, indeholder, større end osv.) og angiver en værdi — præcis samme oplevelse som når du opsætter automatiske handlinger eller adgangsregler.


I databasen gemmes domain-værdier som tekst: den string-repræsentation af en Python-liste. Felt-typen tager sig af serialisering og validering, så udviklere i Python arbejder med rene domain-værdier, mens lagringen håndteres bagved.

Det illustrerer Odoo’s designprincip: felter er ikke bare beholdere til data. De bærer også semantik, brugerfladeadfærd og valideringslogik i én samlet definition.

Hvordan feltet fungerer


Domain-feltet er tæt integreret med ORM’en og filtermekanikken. Her er kort, hvad der sker, når et domain gemmes og evalueres.


Lagring og repræsentation

Når et domain gemmes, serialiserer Odoo det til tekst. Et domain, der f.eks. begrænser poster til udkast for den aktuelle bruger, gemmes som tekst, der evalueres ved forespørgslen. Særlige variabler som uid løses først ved kørsel, så filtrene kan være dynamiske uden hårdkodede værdier.

ORM’en tager denne tekst, evaluerer den sikkert via Odoo’s egne værktøjer og omsætter resultatet til en SQL WHERE-klausul. Evalueringen sker gennem safe_eval, som tillader en kontrolleret delmængde af Python og Odoo-specifikke kontekstvariabler.


Domain-widgetten

I UI bruger felter af typen fields.Domain som standard domæne-widgetten. Den giver det samme grafiske filterværktøj, som brugere møder i mange dele af Odoo: tilføj betingelser, kombiner med OG/ELLER og se resultatet uden at skrive Python.

Det er widgetten, der gør domain-felter tilgængelige for ikke-udviklere. Du behøver ikke kende domain-syntaksen for at bygge et korrekt filter — den visuelle builder klarer konverteringen for dig.


Kontekst i forhold til model

Et Domain-felt kan knyttes til en model, så Odoo ved, hvilke felter der skal tilbydes i builderen. Det angives via model_field i feltdefinitionen. Uden modelkontekst falder widgetten tilbage til almindelig tekstindtastning, hvilket er mindre brugervenligt.


Denne binding mellem felt og model viser, hvordan Odoo forbinder data-definition med UI-opførsel: feltet ved, hvilken model det filtrerer, og interface tilpasser sig derefter.


Samarbejde med andre poster

Domain-felter bruges ofte sammen med relationelle felter — for at begrænse valgmuligheder i Many2one-dropdowns, målrette automatiske handlinger eller afgrænse rapporter og dashboards. Filtrene anvendes på ORM-niveau og respekterer derfor Odoo’s sikkerhedsregler og adgangsrettigheder.

Forretningsscenarier


Domain-felter findes i næsten alle Odoo-moduler. Her er fem konkrete eksempler på, hvordan de løser forretningsbehov.


1. Automatiserede handlinger og email-triggere

Når du opretter en automatiseret handling (Settings > Technical > Automation) angiver du et domain, som bestemmer hvilke poster der udløser handlingen. Et eksempel: en automatisk påmindelse til forfaldne fakturaer målrettes kun bogførte fakturaer, der er ubetalte og overskredet forfaldsdatoen. Dette domain ligger i base.automation i feltet filter_domain — handlingen affyres kun for matchende poster.


2. Record rules og adgangskontrol

Adgangsregler bruger domain-felter til at styre, hvilke poster en brugergruppe kan se eller ændre. En salgsgruppe kan fx kun få adgang til poster tildelt deres eget team — evalueringen sker ved forespørgselstid og giver række-niveau sikkerhed uden ekstra kode. Hver regel er et domain gemt i et Domain-felt.


3. Filtrering i lager og drift

I lagerstyring bruger reordreringsregler og planlagte handlinger domains til at målrette specifikke produktkategorier, lokationer eller lagerniveauer. En automatisk genbestilling kan begrænses til kun at køre på storable produkter under deres genbestillingspunkt og undgår dermed unødvendig behandling af tusindvis af varer.


4. CRM-pipeline og kvalificering af leads

I CRM definerer pipeline-automation, aktivitetsregler og lead-tildeling ofte domains for at kategorisere og matche leads. Et domæne kan f.eks. sende leads til rette sælger baseret på land, branche eller forventet omsætning — hvilket gør reglerne konfigurerbare fra UI frem for at kræve kodeændringer.


5. Dynamiske Many2one-dropdowns

På formularer kan et domain på en Many2one begrænse hvilke poster, der vises i dropdown’en. Fx vise kun aktive leverandører med leverandør-rang > 0. Domains kan også referere til andre felter i samme form, så valgmulighederne ændrer sig dynamisk i takt med brugerens indtastninger.

Oprettelse og tilpasning af feltet


Der er to hovedveje til at arbejde med Domain-felter: no-code i Odoo Studio eller teknisk tilpasning med Python og XML i et modul.


Brug af Odoo Studio

Studio eksponerer ikke altid en separat Domain-felt-type i det visuelle feltværktøj. For mange forretningsbehov er det dog ikke nødvendigt: de indbyggede domain-editorer til automatiseringer, record rules og server handlinger giver en grafisk domænebygger uden behov for et kundet felt.

Vil du tilføje et domain til en Many2one i Studio, kan du redigere feltets egenskaber og indtaste et domain direkte. Studio validerer syntaksen og gemmer domænet i visningsdefinitionen.


Teknisk tilpasning i Python

I et custom modul er det simpelt at tilføje et Domain-felt ved hjælp af ORM’en. Følgende eksempel viser hvordan man definerer feltet i en model:

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'
    )

Her peger model_field på feltet model_name, så domain-widgetten ved, hvilken model der skal tilbydes i den visuelle builder. At holde modelnavnet i et separat felt åbner også for dynamisk modelvalg, hvis det er nødvendigt.


Visning af widgetten i en formview

For at få domain-editoren frem i en form view skal både model-feltet og domain-feltet være med i XML’en og widgetten angives eksplicit:


<field name="model_name" invisible="1"/>
<field name="filter_domain" widget="domain"
       options="{'model': 'model_name'}"/>

Uden widget="domain" og model-optionen vil feltet blot være almindelig tekst. Husk begge dele, når du eksponerer domænekonfiguration til brugere.


Skrive domain-værdier via XML-RPC API’en

Når du sætter domain-feltets værdi programmatisk via API, skal du altid sende værdien som en string.

models.execute_kw(db, uid, api_key, 'my.model', 'write',
    [[record_id], {
        'filter_domain': "[('active', '=', True)]"
    }]
)

At sende en Python-liste i stedet for en string er en hyppig fejl, som kan give fejl eller stiltiende fejl afhængig af Odoo-version. Serialiser altid domænet til en streng før skrivning via API.

Bedste fremgangsmåder


Følgende gode vaner sparer tid og forebygger problemer med domain-felter i Odoo.


Valider domænet før udrulning

Et ugyldigt domain kaster fejl, når Odoo forsøger at evaluere det. Test domæner i søgefeltet eller i udviklertilstand før du gemmer dem i automatiseringer eller record rules. Et hurtigt search_count via API bekræfter også, at domænet returnerer forventet antal poster.


Brug dynamiske variabler når det er muligt

Undgå at hårdkode bruger- eller firma-ID’er og datoer i domæner. Brug i stedet uid, context_today() eller current_company_id. Det gør domænerne portable og forhindrer, at de går i stykker, når miljøer eller data ændrer sig.


Bind altid modelkonteksten

Når du tilføjer et Domain-felt til en model, angiv altid model_field og medtag den i viewet. Uden det får brugerne en almindelig tekstinput i stedet for visual builderen, hvilket øger risikoen for ugyldige værdier.


Hold domæner læsbare

Komplekse, indlejrede domæner med | (OR) og & (AND) bliver hurtigt svære at vedligeholde. Kommentér logikken i din Python-kode, og overvej at bruge en serveraction eller computed field, hvis domænet bliver for indviklet.


Brug safe_eval ved programmatisk evaluering

Når du evaluerer domain-strenge i Python (fx i server actions), brug Odoo’s safe_eval i stedet for Python’s eval. Det er sikrere, håndterer Odoo-kontekst korrekt og matcher Odoo’s interne evalueringsmåde.


Test med realistiske data

Tjek altid at domænet rammer de forventede poster før produktion. Det gælder især for automatiseringer og adgangsregler, hvor et forkert filter kan behandle forkerte poster eller utilsigtet blokere adgang.

Almindelige faldgruber


Her er de mest almindelige fejl, du vil støde på med Domain-felter, og hvordan du undgår dem.


Forveksling af felt-type og domain-syntaks

Begrebet "domain" bruges om to ting i Odoo: selve filter-syntaksen (listen af tuples) og felt-typen fields.Domain, som gemmer disse udtryk. Det er almindeligt at forveksle dem. Husk: Domain-feltet er en databeholder; domain-udtrykket er den logik, som feltet indeholder.


At sende en liste i stedet for en string via API

Skriver du til et Domain-felt via XML-RPC, skal du sende en string, ikke en Python-liste. At sende raw-lister kan føre til typefejl eller stiltiende failures afhængigt af Odoo-versionen. Serialiser altid før skrivning.


Manglende modelkontekst på widgetten

Hvis du placerer et Domain-felt i en formview uden at angive model-kontekst i widget options, får brugeren et almindeligt tekstfelt i stedet for den visuelle builder. Domain-builderen kræver kendskab til modellen — husk derfor altid at sætte model_field i view-definitionen.


Hårdkodede record-ID’er i domæner

Domæner, der peger direkte på specifikke record-ID’er, kan bryde når poster slettes eller når konfiguration flyttes til en anden database. Brug dynamiske referencer som uid eller relationelle opslag for at gøre dine domæner mere robuste og portable.


For brede eller for snævre record rules

En for permissiv record rule kan eksponere for mange poster; en for restriktiv kan skjule poster uden forklaring. Test altid reglerne fra målgruppens synspunkt — ikke fra admin-brugerens, som ofte omgår reglerne.


Mangel på hensyntagen til arkiverede poster

Odoo ekskluderer som standard arkiverede poster (active = False) fra søgninger. Hvis dit domæne ikke tager højde for det, kan du få uventede huller i resultaterne. Inkluder ('active', 'in', [True, False]) når du skal medtage arkiverede poster.

Konklusion


Domain-felter er et af de elementer, der driver store dele af Odoo’s funktionalitet. Fra adgangskontrol og automatiseringer til dynamiske dropdowns og dashboards udgør domain-udtryk rygraden i Odoo’s filtrering — og fields.Domain giver udviklere et valideret og klart format til at gemme og vise denne logik direkte i data-modellen.


For forretningsbrugere gør domain-widgetten det nemt at konfigurere filtre uden kode. For udviklere giver Domain-feltet et mere præcist alternativ til tidligere løsninger, hvor man brugte Char-felter med widget-override. Uanset om du arbejder i Odoo Studio, skriver Python-moduler eller konfigurerer workflows i UI, åbner kendskab til Domain-felter mange muligheder.


De koncepter, vi har gennemgået, gælder bredt på tværs af Odoo-versioner og moduler. At forstå Domain-felter er en god investering — de er simpelthen overalt i Odoo.


Brug for hjælp til jeres Odoo-opsætning?

Dasolo hjælper virksomheder med at implementere, tilpasse og optimere Odoo efter deres konkrete behov. Om det er automatiseringer, skræddersyede moduler eller bedre udnyttelse af jeres nuværende installation, har vores team den tekniske ekspertise til at drive projektet fremad.

Har du spørgsmål om Domain-felter eller andre aspekter af din Odoo-implementering, så kontakt osogså gerne med adgang til jeres opsætning — vi hjælper med at gennemgå konfigurationen og foreslå de bedste næste skridt.

Domain Fields i Odoo: Den Komplette Guide for Udviklere and Brugere
Dasolo 6. marts 2026
Del dette indlæg
Log ind for at skrive en kommentar