Hvis du har brugt tid på at konfigurere Odoo, er du sikkert stødt på domæneudtryk. Disse filterbetingelser med parenteser vises i handlingsknapper, automatiserede regler, registreringsregler og e-mail-skabeloner på hele platformen. Men færre mennesker er klar over, at Odoo også tilbyder en dedikeret domænefeltstype i sin ORM, designet specifikt til at gemme og vise disse udtryk som strukturerede data.
At forstå domænefelter er vigtigt, uanset om du er en Odoo-udvikler, der bygger brugerdefinerede moduler, eller en forretningsbruger, der konfigurerer automatiserede arbejdsgange. Denne guide dækker alt fra, hvad et domænefelt faktisk gemmer, til praktiske eksempler, udviklingstips og de mest almindelige fejl, du skal undgå.
Hvad er domænefeltet i Odoo
I Odoo er et domæne en liste over filterbetingelser, der bruges til at forespørge poster. Det følger en specifik syntaks ved hjælp af tupler og logiske operatorer, og det kortlægger direkte til SQL WHERE-klausuler, når Odoo kører en databaseforespørgsel.
Et typisk domæneudtryk ser sådan ud:
[('customer_rank', '>', 0), ('active', '=', True)]
Dette oversættes til: returner alle poster, hvor customer_rank er større end 0 OG active er sand.
Det Domænefelt (fields.Domain) er en felttype i Odoo ORM, der gemmer disse udtryk som strukturerede data inde i en post. I modsætning til et almindeligt tekstfelt kommer det med indbygget validering og et dedikeret UI-widget, der lader brugerne opbygge filterbetingelser visuelt, uden at skrive nogen kode.
Hvordan det vises i grænsefladen
I Odoo-grænsefladen gengives et Domænefelt ved hjælp af domæneeditor-widgeten som standard. Denne widget præsenterer en visuel regelbygger, hvor brugerne kan vælge et felt, vælge en operator (lig med, indeholder, større end osv.) og indtaste en værdi. Det er den samme grænseflade, du ser, når du konfigurerer adgangsregler eller filterkriterier i automatiserede handlinger.
I databasen gemmes domæneværdier som almindelig tekst, specifikt som den strengrepræsentation af en Python-liste. Felttypen håndterer serialisering og validering gennemsigtigt, så udviklere arbejder med rene domæneværdier i Python, mens lagringslaget håndterer resten.
Dette er en del af det bredere Odoo datamodel design: felter er ikke bare opbevaringsbeholdere. De bærer semantisk betydning, UI-adfærd og valideringslogik sammen i en enkelt definition.
Hvordan feltet fungerer
Domænefeltet integreres tæt med Odoo ORM og postfiltreringssystemet. Her er hvad der sker under motorhjelmen, når du gemmer og evaluerer et domæne.
Lagring og repræsentation
Når et domæne gemmes i databasen, gemmer Odoo det som en serialiseret streng. Et domæne, der begrænser poster til udkaststilstand for den nuværende bruger, gemmes som en tekstværdi, som Odoo evaluerer ved forespørgselstidspunktet. Den specielle variabel uid bliver løst til den nuværende bruger-ID ved kørsel, hvilket gør dynamisk filtrering muligt uden at hardkode værdier.
Odoo ORM tager den streng, evaluerer den sikkert og konverterer den til en SQL WHERE-klausul. Denne evaluering sker gennem safe_eval, som understøtter et kontrolleret delmængde af Python-udtryk sammen med Odoo-specifikke kontekstvariabler.
Domænewidgeten
I Odoo-grænsefladen bruger felter af typen fields.Domain domænewidgeten som standard. Denne widget præsenterer filterbyggeren, du ser på mange dele af Odoo. Brugere kan tilføje betingelser, kombinere dem med AND- eller OR-logik og forhåndsvise resultater uden at røre ved nogen kode.
Widget'en er det, der gør domænefelter virkelig tilgængelige for forretningsbrugere. Du behøver ikke at forstå domænesyntaks for at konfigurere et filter. Den visuelle builder håndterer oversættelsen for dig.
Model kontekst
Et domænefelt kan være knyttet til en specifik model, som fortæller Odoo, hvilke felter der skal tilbydes i domænebyggeren. Du indstiller dette via model_field attributten i feltdefinitionen. Uden en modelkontekst falder domænewidget'en tilbage til et almindeligt tekstinput, hvilket er langt mindre nyttigt for slutbrugere.
Denne kontekstbinding er en kernekomponent i, hvordan Odoo-rammen forbinder feltdefinitioner med UI-adfærd. Feltet kender til den model, det filtrerer, og grænsefladen tilpasser sig derefter.
Interaktion med andre poster
Domænefelter bruges ofte sammen med relationelle felter for at begrænse, hvilke poster der vises i en Many2one dropdown, for at definere, hvilke poster en automatiseret handling retter sig mod, eller for at sætte omfanget af en rapport eller dashboard. Domæneudtrykket fungerer som et live filter anvendt på ORM-niveau, hvilket betyder, at det respekterer Odoo sikkerhedsregler og feltadgangskontroller.
Forretningsanvendelser
Domænefelter vises i stort set hver Odoo-modul. Her er fem virkelige eksempler, der viser, hvordan de driver praktiske forretningsarbejdsgange.
1. Automatiserede handlinger og e-mail-udløsere
Når du konfigurerer en automatiseret handling i Odoo (Indstillinger > Teknisk > Automatisering), definerer du et domæne for at specificere, hvilke poster der udløser handlingen. For eksempel kan en automatiseret e-mail for forfaldne fakturaer kun målrette mod bogførte fakturaer, der er ubetalte og overskredet deres forfaldsdato. Dette domæne gemmes direkte på base.automation modellen i et domænefelt kaldet filter_domain. Handlingen udløses kun for poster, der matcher.
2. Postregler og adgangskontrol
Odoo sikkerhedspostregler bruger domænefelter til at begrænse, hvilke poster en brugergruppe kan se eller redigere. En salgsteamregel kan begrænse synligheden til poster, der er tildelt det nuværende brugerteam, evalueret på forespørgselstidspunktet. Dette giver dig række-niveau sikkerhed uden at skrive brugerdefineret kode. Hver filter på hver postregel i Odoo er et domæneudtryk gemt i et domænefelt.
3. Lager- og driftsfiltrering
I lager- og inventarstyring bruger planlagte handlinger og genbestillingsregler domæner til at målrette specifikke produktkategorier, placeringer eller lagerniveauer. En automatiseret genopfyldningshandling kan begrænses til opbevaringsprodukter med tilgængelig mængde på eller under et genbestillingspunkt, hvilket forhindrer unødvendig behandling på tværs af tusindvis af poster.
4. CRM pipeline og leadkvalifikation
I CRM-modulet afhænger automatisering af pipeline-faser, aktivitetsregler og leadtildeling alle af domæneudtryk til at kategorisere og kvalificere leads. Tilpassede regler for leadtildeling bruger domæner til at matche leads med den rigtige sælger baseret på land, branche eller aftalestørrelse. Domænfeltet er det, der gør disse regler konfigurerbare fra grænsefladen i stedet for at kræve kodeændringer for hvert nyt scenarie.
5. Dynamiske Many2one dropdowns
I tilpassede formularer kontrollerer et domæne anvendt på et Many2one-felt, hvilke poster der vises i dropdown-menuen. At begrænse et leverandørfelt til kun at vise aktive leverandører med en ikke-nul leverandørrang skaber mere fokuserede brugeroplevelser og reducerer indtastningsfejl. Domænet kan endda være dynamisk og referere til værdier fra andre felter på den samme formular, hvilket gør de tilgængelige muligheder ændre sig baseret på brugerens valg.
Oprettelse eller tilpasning af feltet
Der er to hovedmetoder til at arbejde med domænefelter i Odoo: at bruge Odoo Studio til no-code tilpasning eller at skrive Python og XML i et tilpasset modul.
Brug af Odoo Studio
Odoo Studio eksponerer i øjeblikket ikke en selvstændig Domænefeltstype i sin visuelle feltcreator. Til de fleste forretningskonfigurationsbehov har du ikke brug for en. De eksisterende domæneeditorer, der er indbygget i automatiserede handlinger, postregler og serverhandlinger, giver dig den visuelle domænebygger uden at kræve et tilpasset felt.
Hvis du vil tilføje et domænefilter til et Many2one-felt på en formular, kan du gøre det i Studio ved at redigere feltets egenskaber og indtaste et domæneudtryk direkte. Studio validerer domænesyntaksen og gemmer den på visningsdefinitionen.
Teknisk tilpasning i Python
I et tilpasset Odoo-modul er det at tilføje et domænefelt en ligetil del af den standard odoo udviklerguide. Her er et grundlæggende eksempel ved hjælp af 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='Domæneudtryk til at filtrere partnerposter'
)
Attributten model_field linker domæneeditoren til modelnavnet, der er gemt i model_name. Dette fortæller domænewidgeten, hvilke felter der skal tilbydes i den visuelle builder. At holde modelnavnet i et separat felt tillader også dynamisk modelvalg, hvis din brugssag kræver det.
Tilføjelse af widgeten til en formularvisning
For at vise domænebyggeren i en formularvisning, henvis både til modelfeltet og domænefeltet i visnings-XML:
<field name="model_name" invisible="1"/>
<field name="filter_domain" widget="domain"
options="{'model': 'model_name'}"/>
Uden widget="domain" erklæringen og modelmuligheden gengives feltet som almindelig tekst. Inkluder altid begge, når du bygger formularer, der eksponerer domænekonfiguration til brugere.
Skrive domæneværdier via XML-RPC API'en
Hvis du indstiller domænefeltværdier programmatisk via API'en, skal du altid sende værdien som en streng:
models.execute_kw(db, uid, api_key, 'my.model', 'write',
[[record_id], {
'filter_domain': "[('active', '=', True)]"
}]
)
At sende et Python-listeobjekt i stedet for en streng er en almindelig fejl, der forårsager fejl eller stille fejl afhængigt af Odoo-versionen. Serialiser altid dit domæne til en streng, før du skriver det gennem API'en.
Bedste praksis
Disse praktiske vaner vil spare dig tid og forhindre problemer, når du arbejder med domænefelter i Odoo.
Valider domænesyntaks før implementering
Et ugyldigt domæneudtryk rejser fejl i det øjeblik, Odoo forsøger at evaluere det. Test dine domæner i Odoo-søgefeltet eller i udviklermode, før du gemmer dem til automatiserede handlinger eller rekordregler. Et hurtigt search_count kald via API'en er også en pålidelig måde at bekræfte, at et domæne returnerer det forventede antal poster.
Brug dynamiske variabler hvor det er muligt
Undgå at hardkode bruger-ID'er, virksomhed-ID'er eller datoer i domæneudtryk. Brug dynamiske variabler som uid, context_today() og current_company_id i stedet. Dette holder dine domæner bærbare og undgår stille brud, når poster ændres mellem miljøer.
Bind altid modelkonteksten
Når du tilføjer et domænefelt til en brugerdefineret model, skal du altid indstille model_field-attributten og inkludere den i visningen. Uden det ser brugerne et almindeligt tekstinput i stedet for den visuelle domænebygger, hvilket reducerer brugervenligheden og øger chancen for, at ugyldige værdier bliver gemt.
Hold domæner læselige
Komplekse indlejrede domæner, der bruger | (ELLER) og & (OG) operatorer, kan blive svære at læse og vedligeholde. Tilføj kommentarer i din Python-kode, der forklarer hensigten bag hvert domæne. Hvis et domæne bliver meget komplekst, skal du overveje, om en serverhandling eller et beregnet felt ville være klarere og lettere at teste.
Brug safe_eval til programmatisk evaluering
Når du evaluerer domænestrenge i Python-kode, for eksempel inde i en serverhandling eller automatiseret handling, skal du bruge Odoo's indbyggede safe_eval i stedet for Python's native eval. Det er sikrere, håndterer Odoo-specifikke kontekstvariabler korrekt og er konsekvent med, hvordan Odoo evaluerer domæner internt.
Test med realistiske data
Verificer altid, at dit domæne matcher de forventede poster, før du går live. Dette er især vigtigt for automatiserede handlinger og postregler, hvor et forkert filter kan behandle de forkerte poster eller blokere brugeradgang uden nogen synlig advarsel.
Almindelige faldgruber
Her er de fejl, der oftest opstår, når man arbejder med domænefelter i Odoo, og hvordan man undgår dem.
Forveksling af felttypen med domænesyntaks
Ordet "domæne" betyder to forskellige ting i Odoo. Det refererer til filter syntaksen (en liste af tupler), og det refererer også til fields.Domain, en specifik ORM felt type der gemmer disse udtryk som data. Nykommere til Odoo tilpasning blander ofte de to sammen. Et Domæne felt er en lagringsbeholder. Domæneudtrykket er filterlogikken indeni det.
At sende en liste i stedet for en streng via API'en
Når du skriver til et Domæne felt via XML-RPC, skal du sende en streng, ikke et Python listeobjekt. At sende domænet som en rå liste vil forårsage en typefejl eller stille fejl afhængigt af Odoo-versionen. Sørg altid for at serialisere dit domæne til en streng, før du skriver det gennem API'en.
Manglende model kontekst på widgeten
Hvis du tilføjer et Domæne felt til en formularvisning uden at specificere model konteksten i widgetindstillingerne, vil brugerne se et almindeligt tekstinput i stedet for den visuelle domænebygger. Domænebyggeren vises kun, når widgeten ved, hvilken model der skal refereres til. Inkluder altid model_field linket i din visningsdefinition.
Hardcoding af post-ID'er i domæner
Domæner, der direkte refererer til specifikke post-ID'er, bryder stille, når disse poster slettes, eller når du kopierer konfigurationen til en ny database. Brug dynamiske referencer som uid eller relationelle opslag, hvor det er muligt, for at holde dine domæner bærbare.
Overdreven brede eller restriktive postregel domæner
Et postregel domæne, der er for tilladende, kan eksponere poster for brugere, der ikke bør se dem. Et, der er for restriktivt, kan stille skjule poster uden nogen forklaring til brugeren. Test altid postregel domæner fra perspektivet af den målrettede brugergruppe, ikke admin-kontoen, der omgår alle regler.
At glemme arkiverede poster
Som standard udelukker Odoo arkiverede poster (hvor active = False) fra søgeresultaterne. Hvis dit domæne ikke tager højde for dette, kan du få uventede huller i dine data. Tilføj ('active', 'in', [True, False]), når du har brug for at inkludere arkiverede poster i filterresultaterne.
Konklusion
Domænefelter er en af de byggesten, der stille driver en stor del af, hvordan Odoo fungerer. Fra adgangskontrol og automatiserede handlinger til dynamiske dropdowns og dashboardfiltre, er domæneudtryk rygraden i postfiltrering i Odoo, og fields.Domain typen giver udviklere en ren, valideret måde at gemme og præsentere den logik 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.