Hvis du har brukt tid på å konfigurere Odoo, har du sannsynligvis kommet over domenekspresjoner. Disse filterbetingelsene med parenteser vises i handlingsknapper, automatiserte regler, postregler og e-postmaler gjennom hele plattformen. Men færre mennesker innser at Odoo også tilbyr en dedikert domenefelt-type i sitt ORM, designet spesifikt for å lagre og vise disse uttrykkene som strukturert data.
Å forstå domenefelt er viktig enten du er en Odoo-utvikler som bygger tilpassede moduler eller en forretningsbruker som konfigurerer automatiserte arbeidsflyter. Denne guiden dekker alt fra hva et domenefelt faktisk lagrer til praktiske eksempler, utviklingstips og de vanligste feilene å unngå.
Hva er domenefeltet i Odoo
I Odoo er et domen en liste over filterbetingelser som brukes til å forespørre poster. Det følger en spesifikk syntaks ved hjelp av tupler og logiske operatorer, og det kartlegger direkte til SQL WHERE-klausuler når Odoo kjører en databaseforespørsel.
En typisk domenekspresjon ser slik ut:
[('customer_rank', '>', 0), ('active', '=', True)]
Dette oversettes til: returner alle poster der customer_rank er større enn 0 OG active er True.
Det Domene-feltet (fields.Domain) er en felttype i Odoo ORM som lagrer disse uttrykkene som strukturerte data inne i en post. I motsetning til et vanlig tekstfelt, kommer det med innebygd validering og et dedikert UI-widget som lar brukere bygge filterbetingelser visuelt, uten å skrive noe kode.
Hvordan det vises i grensesnittet
I Odoo-grensesnittet gjengis et Domene-felt ved hjelp av domeneeditor-widgeten som standard. Denne widgeten presenterer en visuell regelbygger der brukere kan velge et felt, velge en operator (lik, inneholder, større enn, og så videre), og skrive inn en verdi. Det er det samme grensesnittet du ser når du konfigurerer tilgangsregler eller filterkriterier i automatiserte handlinger.
I databasen lagres domeneverdier som vanlig tekst, spesifikt som strengrepresentasjonen av en Python-liste. Felttypen håndterer serialisering og validering på en gjennomsiktig måte, slik at utviklere jobber med rene domeneverdier i Python mens lagringslaget håndterer resten.
Dette er en del av den bredere Odoo datamodell designen: felt er ikke bare lagringsbeholdere. De bærer semantisk mening, UI-atferd og valideringslogikk sammen i en enkelt definisjon.
Hvordan feltet fungerer
Domene-feltet integreres tett med Odoo ORM og postfiltreringssystemet. Her er hva som skjer under panseret når du lagrer og evaluerer et domene.
Lagring og representasjon
Når et domene lagres i databasen, lagrer Odoo det som en serialisert streng. Et domene som begrenser poster til utkaststatus for den nåværende brukeren lagres som en tekstverdi som Odoo evaluerer ved spørringstidspunktet. Den spesielle variabelen uid løses til den nåværende bruker-ID-en ved kjøretid, noe som gjør dynamisk filtrering mulig uten å hardkode verdier.
Odoo ORM tar den strengen, evaluerer den trygt, og konverterer den til en SQL WHERE-klausul. Denne evalueringen skjer gjennom safe_eval, som støtter et kontrollert delsett av Python-uttrykk sammen med Odoo-spesifikke kontekstvariabler.
Domene-widgeten
I Odoo-grensesnittet bruker felt av typen fields.Domain domene-widgeten som standard. Denne widgeten presenterer filterbyggeren du ser på mange deler av Odoo. Brukere kan legge til betingelser, kombinere dem med OG- eller ELLER-logikk, og forhåndsvise resultater uten å berøre noen kode.
Widgeten er det som gjør domenefelt virkelig tilgjengelige for forretningsbrukere. Du trenger ikke å forstå domenesyntaks for å konfigurere et filter. Den visuelle byggeren håndterer oversettelsen for deg.
Modellkontekst
Et domenefelt kan knyttes til en spesifikk modell, som forteller Odoo hvilke felt som skal tilbys i domenebyggeren. Du setter dette via model_field-attributtet i feltdefinisjonen. Uten en modellkontekst faller domenewidgeten tilbake til et vanlig tekstfelt, som er langt mindre nyttig for sluttbrukere.
Denne kontekstbindingen er en kjernekomponent i hvordan Odoo-rammeverket kobler feltdefinisjoner til UI-atferd. Feltet vet om modellen det filtrerer, og grensesnittet tilpasser seg deretter.
Interaksjon med andre poster
Domenefelt brukes ofte sammen med relasjonsfelt for å begrense hvilke poster som vises i en Many2one nedtrekksliste, for å definere hvilke poster en automatisert handling retter seg mot, eller for å sette omfanget av en rapport eller et dashbord. Domenesetningen fungerer som et livefilter som brukes på ORM-nivå, noe som betyr at det respekterer Odoo-sikkerhetsregler og felt tilgangskontroller.
Forretningsbrukstilfeller
Domenefelt vises i praktisk talt hver Odoo-modul. Her er fem virkelige eksempler som viser hvordan de driver praktiske forretningsarbeidsflyter.
1. Automatiserte handlinger og e-postutløsere
Når du konfigurerer en automatisert handling i Odoo (Innstillinger > Teknisk > Automatisering), definerer du et domene for å spesifisere hvilke poster som utløser handlingen. For eksempel kan en automatisert e-post for forfalte fakturaer kun målrette mot posterte fakturaer som er ubetalte og overskredet forfallsdato. Dette domenet lagres direkte på base.automation-modellen i et domenefelt kalt filter_domain. Handlingen utløses kun for poster som samsvarer.
2. Postregler og tilgangskontroll
Odoo sikkerhetspostregler bruker domenefelt for å begrense hvilke poster en brukergruppe kan se eller redigere. En salgsteamregel kan begrense synligheten til poster som er tildelt det nåværende brukerteamet, evaluert på spørringstidspunktet. Dette gir deg radnivå sikkerhet uten å skrive tilpasset kode. Hvert filter på hver postregel i Odoo er en domenesetning lagret i et domenefelt.
3. Filtrering av lager og operasjoner
I lager- og inventarstyring bruker planlagte handlinger og gjenbestillingsregler domener for å målrette spesifikke produktkategorier, lokasjoner eller lagerbeholdninger. En automatisert påfyllingshandling kan avgrenses til lagringsbare produkter med tilgjengelig mengde på eller under et gjenbestillingspunkt, noe som forhindrer unødvendig behandling på tvers av tusenvis av poster.
4. CRM-pipeline og kvalifisering av leads
I CRM-modulen er automatisering av pipeline-faser, aktivitetsregler og tildeling av leads avhengig av domeneuttrykk for å kategorisere og kvalifisere leads. Tilpassede regler for tildeling av leads bruker domener for å matche leads med riktig selger basert på land, bransje eller avtales størrelse. Domene-feltet er det som gjør disse reglene konfigurerbare fra grensesnittet i stedet for å kreve kodeendringer for hvert nytt scenario.
5. Dynamiske Many2one nedtrekkslister
I tilpassede skjemaer kontrollerer et domene som brukes på et Many2one-felt hvilke poster som vises i nedtrekkslisten. Å begrense et leverandørfelt til å vise kun aktive leverandører med en ikke-null leverandørrangering skaper mer fokuserte brukeropplevelser og reduserer inndatafeil. Domenet kan til og med være dynamisk, og referere til verdier fra andre felt på samme skjema, noe som gjør at de tilgjengelige alternativene endres basert på brukerens valg.
Opprette eller tilpasse feltet
Det er to hovedmetoder for å arbeide med domene-felt i Odoo: bruke Odoo Studio for tilpasning uten kode, eller skrive Python og XML i en tilpasset modul.
Bruke Odoo Studio
Odoo Studio eksponerer for øyeblikket ikke en frittstående Domene-felt type i sin visuelle feltoppretter. For de fleste forretningskonfigurasjonsbehov trenger du ikke en. De eksisterende domene-redigererne innebygd i automatiserte handlinger, postregler og serverhandlinger gir deg den visuelle domenebyggeren uten å kreve et tilpasset felt.
Hvis du vil legge til et domene-filter til et Many2one-felt på et skjema, kan du gjøre det i Studio ved å redigere feltets egenskaper og skrive inn et domeneuttrykk direkte. Studio validerer domenesyntaksen og lagrer den i visningsdefinisjonen.
Teknisk tilpasning i Python
I en tilpasset Odoo-modul er det å legge til et domene-felt en enkel del av den standard odoo utviklerguiden. Her er et grunnleggende eksempel som bruker 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='Domeneuttrykk for å filtrere partnerposter'
)
Attributtet model_field kobler domeneditoren til modellenavnet som er lagret i model_name. Dette forteller domenwidgeten hvilke felt som skal tilbys i den visuelle byggeren. Å holde modellenavnet i et eget felt tillater også dynamisk modellvalg hvis bruken din krever det.
Legge til widgeten i et skjema
For å vise domenbyggeren i et skjema, referer til både modellen og domenfeltet i XML-en:
<field name="model_name" invisible="1"/>
<field name="filter_domain" widget="domain"
options="{'model': 'model_name'}"/>
Uten widget="domain" erklæringen og modellen, vil feltet bli vist som vanlig tekst. Inkluder alltid begge når du bygger skjemaer som eksponerer domenkonfigurasjon til brukere.
Skrive domenverdier via XML-RPC API
Hvis du setter domenfeltverdier programmatisk via API-en, må du alltid sende verdien som en streng:
models.execute_kw(db, uid, api_key, 'my.model', 'write',
[[record_id], {
'filter_domain': "[('active', '=', True)]"
}]
)
Å sende et Python-listeobjekt i stedet for en streng er en vanlig feil som forårsaker feil eller stille feil avhengig av Odoo-versjonen. Serialiser alltid domenet ditt til en streng før du skriver det gjennom API-en.
Beste praksis
Disse praktiske vanene vil spare deg for tid og forhindre problemer når du arbeider med domenfelt i Odoo.
Valider domensyntaks før distribusjon
Et ugyldig domenuttrykk gir feil i det øyeblikket Odoo prøver å evaluere det. Test domenene dine i Odoo-søkefeltet eller i utviklermodus før du lagrer dem til automatiserte handlinger eller registreringsregler. Et raskt search_count kall via API-en er også en pålitelig måte å bekrefte at et domene returnerer det forventede antallet poster.
Bruk dynamiske variabler der det er mulig
Unngå å hardkode bruker-ID-er, selskaps-ID-er eller datoer i domenuttrykk. Bruk dynamiske variabler som uid, context_today() og current_company_id i stedet. Dette holder domenene dine bærbare og unngår stille feil når poster endres mellom miljøer.
Bind alltid modellkonteksten
Når du legger til et domenfelt i en tilpasset modell, må du alltid sette model_field-attributtet og inkludere det i visningen. Uten det ser brukerne en vanlig tekstinnputt i stedet for den visuelle domenebyggeren, noe som reduserer brukervennligheten og øker sjansen for at ugyldige verdier blir lagret.
Hold domenene lesbare
Komplekse nestede domener som bruker | (ELLER) og & (OG) operatorer kan bli vanskelige å lese og vedlikeholde. Legg til kommentarer i Python-koden din som forklarer hensikten bak hvert domene. Hvis et domene blir veldig komplekst, vurder om en serverhandling eller beregnet felt ville vært klarere og lettere å teste.
Bruk safe_eval for programmatisk evaluering
Når du evaluerer domenestrenger i Python-kode, for eksempel inne i en serverhandling eller automatisert handling, bruk Odoo innebygd safe_eval i stedet for Python-nativ eval. Det er sikrere, håndterer Odoo-spesifikke kontekstvariabler korrekt, og er konsistent med hvordan Odoo evaluerer domener internt.
Test med realistiske data
Verifiser alltid at domenet ditt samsvarer med de forventede postene før du går live. Dette er spesielt viktig for automatiserte handlinger og postregler, der et feilfilter kan behandle feil poster eller blokkere brukerens tilgang uten noen synlig advarsel.
Vanlige fallgruver
Her er feilene som oftest oppstår når man arbeider med domenefelt i Odoo, og hvordan man unngår dem.
Forveksling av felttypen med domenesyntaks
Ordet "domene" betyr to forskjellige ting i Odoo. Det refererer til filter-syntaksen (en liste med tupler), og det refererer også til fields.Domain, en spesifikk ORM-felt type som lagrer disse uttrykkene som data. Nykommere til Odoo-tilpasning blander ofte de to sammen. Et Domene-felt er en lagringsbeholder. Domeneuttrykket er filterlogikken inni det.
Å sende en liste i stedet for en streng via API-en
Når du skriver til et Domene-felt via XML-RPC, må du sende en streng, ikke et Python listeobjekt. Å sende domenet som en rå liste vil forårsake en typefeil eller stille feil avhengig av Odoo-versjonen. Serialiser alltid domenet ditt til en streng før du skriver det gjennom API-en.
Mangler modellkontekst på widgeten
Hvis du legger til et Domene-felt i et skjema uten å spesifisere modellkonteksten i widgetalternativene, vil brukerne se et vanlig tekstinnhold i stedet for den visuelle domenebyggeren. Domenebyggeren vises bare når widgeten vet hvilken modell den skal referere til. Inkluder alltid model_field-lenken i definisjonen av visningen din.
Hardkoding av post-ID-er i domener
Domener som refererer til spesifikke post-ID-er direkte bryter stille når disse postene blir slettet eller når du kopierer konfigurasjonen til en ny database. Bruk dynamiske referanser som uid eller relasjonsoppslag der det er mulig for å holde domenene dine portable.
Overdrevent brede eller restriktive postregel-domener
Et postregel-domene som er for permissivt kan eksponere poster for brukere som ikke skal se dem. Et som er for restriktivt kan stille skjule poster uten noen forklaring til brukeren. Test alltid postregel-domener fra perspektivet til målgruppen, ikke admin-kontoen som omgår alle regler.
Glemmer arkiverte poster
Som standard ekskluderer Odoo arkiverte poster (hvor active = False) fra søkeresultater. Hvis domenet ditt ikke tar hensyn til dette, kan du få uventede hull i dataene dine. Legg til ('active', 'in', [True, False]) når du trenger å inkludere arkiverte poster i filterresultatene.
Konklusjon
Domene-feltene er en av de byggeklossene som stille driver en stor del av hvordan Odoo fungerer. Fra tilgangskontroll og automatiserte handlinger til dynamiske nedtrekkslister og dashbordfiltre, er domeneuttrykk ryggraden i postfiltrering i Odoo, og fields.Domain-typen gir utviklere en ren, validert måte å lagre og presentere den logikken direkte i Odoo datamodellen.
For business users, the domain widget makes filter configuration accessible without any code. For developers, the Domain field type brings clarity to model definitions that used to rely on generic Char fields with a widget override. Whether you are working in Odoo Studio, writing a custom Python module, or configuring automated workflows from the interface, understanding how domain fields work opens up a wide range of possibilities.
The concepts covered in this guide apply across Odoo versions and modules. Time spent understanding domain fields is time well invested, because they are genuinely everywhere in Odoo.
Need help with your Odoo implementation?
Dasolo helps companies implement, customize, and optimize Odoo for their specific business needs. Whether you are setting up automated workflows, building custom modules, or trying to get more out of your existing Odoo setup, our team has the technical depth to help you move forward with confidence.
If you have questions about Domain fields or any other aspect of your Odoo implementation, reach out to us. We are happy to take a look at your setup and point you in the right direction.