Wenn Sie Odoo schon einmal konfiguriert haben, sind Ihnen sicher Filterbedingungen begegnet, die in eckigen Klammern stehen. Solche Ausdrücke tauchen in Aktionsbuttons, automatisierten Regeln, Zugriffsbeschränkungen und E-Mail-Vorlagen auf. Weniger bekannt ist, dass Odoo dafür auch einen speziellen Feldtyp im ORM anbietet: das Domain-Feld, das Filterlogik als strukturierte Daten speichern und im UI als bedienbarer Filter-Builder darstellen kann.
Ob Sie Entwickler sind, der Module baut, oder Key-User, der Workflows ohne Coding anpasst: Zu wissen, was ein Domain-Feld tatsächlich speichert und wie man es sicher einsetzt, spart später viel Aufwand. Diese Übersicht erklärt Zweck, Einsatzszenarien, technische Details und typische Stolperfallen.
Was ist das Domain-Feld in Odoo
In Odoo bezeichnet ein Domain eine Liste von Bedingungen, mit denen Datensätze gefiltert werden. Sie hat eine eigene Syntax aus Tupeln und logischen Operatoren und wird bei einer Suche in eine SQL WHERE-Bedingung überführt.
Beispiel einer Domain
[('customer_rank', '>', 0), ('active', '=', True)]
Diese Regel bedeutet: Liefere alle Datensätze, bei denen customer_rank größer als 0 ist UND active auf True steht.
Der Feldtyp Domain (fields.Domain) ist ein spezielles Feld im Odoo-ORM, das solche Filterausdrücke als Daten speichert. Im Gegensatz zu einem einfachen Textfeld prüft es die Syntax, bietet Serialisierung und kann im Frontend über ein eigenes Widget visuell bearbeitet werden.
Darstellung im Interface
Im Interface nutzt ein Domain-Feld normalerweise den Domain-Editor: ein visueller Regel-Builder, in dem Nutzer ein Feld auswählen, Operatoren wie =, enthält oder > auswählen und Werte eingeben können. Genau dasselbe Werkzeug begegnet Ihnen beim Einrichten von Zugriffskontrollen oder automatisierten Aktionen.
In der Datenbank werden Domain-Werte als Text abgelegt — die stringrepräsentation einer Python-Liste. Das Feld kümmert sich um Serialisierung und Validierung, sodass Entwickler in Python mit gültigen Domain-Strings arbeiten können, während die Persistenzschicht das Speichern übernimmt.
Das zeigt einen Grundgedanken des Odoo-Datenmodells: Felder sind mehr als nur Speicherplätze. Sie verkapseln auch Bedeutung, UI-Verhalten und Validierungslogik in einer einzigen Definition.
Wie das Feld funktioniert
Wie Domain-Felder im Hintergrund mit dem ORM zusammenarbeiten
Speicherung und Darstellung
Wird eine Domain gespeichert, legt Odoo sie als serialisierten String ab. Variablen wie uid werden zur Laufzeit aufgelöst, sodass Filter dynamisch bleiben — etwa wenn eine Regel nur für den aktuell eingeloggten Benutzer gelten soll.
Beim Ausführen von Suchanfragen wertet das ORM den gespeicherten String kontrolliert aus (mittels safe_eval) und übersetzt die Bedingung in eine entsprechende SQL WHERE-Klausel. safe_eval erlaubt dabei nur einen sicheren, eingeschränkten Ausdrucksraum und kennt Odoo-spezifische Kontextfunktionen.
Das Domain-Widget
Standardmäßig verwenden Felder vom Typ fields.Domain das Domain-Widget. Nutzer können dort Bedingungen hinzufügen, mit UND/ODER verknüpfen und Ergebnisse direkt prüfen — ohne Code schreiben zu müssen.
Gerade dieses Widget macht Domain-Felder für Fachanwender zugänglich: Die visuelle Oberfläche übernimmt die eigentliche Syntaxarbeit und reduziert Fehler bei der Konfiguration.
Modellkontext
Ein Domain-Feld kann an ein Modell gebunden werden, damit der Builder weiß, welche Feldnamen und Datentypen angeboten werden. Dies geschieht über das Attribut model_field im Feld. Fehlt dieser Kontext, fällt das Widget auf ein einfaches Textfeld zurück, was die Bedienbarkeit deutlich verschlechtert.
Die Kontextbindung zeigt, wie Odoo Felddefinitionen mit dem UI verknüpft: Das Feld weiß, auf welches Modell es filtert, und die Oberfläche passt sich entsprechend an.
Zusammenspiel mit anderen Datensätzen
Domain-Felder werden oft zusammen mit relationalen Feldern eingesetzt — etwa um die Einträge in einem Many2one-Dropdown einzuschränken, um Zielmengen für Automatisierungen zu definieren oder um Scope von Reports festzulegen. Weil der Filter auf ORM-Ebene greift, respektiert er zugleich Odoos Sicherheits- und Zugriffsregeln.
Praxisbeispiele aus dem Business-Alltag
Domain-Felder begegnen Ihnen in fast jedem Odoo-Modul. Folgende Beispiele zeigen typische Business-Anwendungen.
1. Automatisierte Aktionen und E-Mail-Auslöser
Beim Anlegen einer automatisierten Aktion definieren Sie eine Domain, die festlegt, welche Datensätze die Aktion auslösen. Ein Mahn-E-Mail-Workflow könnte z. B. nur auf gebuchte, unbezahlte Rechnungen nach Fälligkeitsdatum abzielen. Diese Domain liegt auf dem Modell base.automation in einem Domain-Feld namens filter_domain und bestimmt, für welche Datensätze die Aktion ausgeführt wird.
2. Record rules und Zugriffskontrolle
Record-Rules verwenden Domain-Felder, um zu beschreiben, welche Datensätze eine Benutzergruppe sehen oder bearbeiten darf. Beispielsweise kann eine Regel Sichtbarkeit auf Datensätze des aktuellen Verkaufsteams einschränken — ausgewertet zur Laufzeit. So entsteht eine Zeilenebenen-Sicherheit ohne eigenen Code; jede Record-Rule speichert ihre Bedingung als Domain.
3. Filter in Lager und Logistik
Im Lagerwesen nutzen geplante Aufgaben und Nachbestellregeln Domains, um bestimmte Produktkategorien, Lagerorte oder Bestandsniveaus anzusprechen. Eine automatische Nachbestellung lässt sich z. B. auf lagerfähige Produkte mit Bestand unter dem Nachbestellpunkt begrenzen und spart so unnötige Verarbeitung großer Datenmengen.
4. CRM-Pipeline und Lead-Qualifizierung
In CRM steuern Domains die Automatisierung von Pipeline-Stufen, Aktivitäten und Lead-Zuordnung. Mit Domains lassen sich Leads nach Land, Branche oder Umsatzgröße dem richtigen Vertriebsmitarbeiter zuordnen. Das macht Regeln über die Oberfläche flexibel konfigurierbar, statt für jede Änderung in den Code eingreifen zu müssen.
5. Dynamische Many2one-Auswahllisten
Auf Formularen begrenzt eine Domain auf einem Many2one-Feld die sichtbaren Optionen. Ein Lieferantenfeld, das nur aktive Lieferanten mit Lieferanten-Rang > 0 zeigt, reduziert Fehleingaben. Domains können sich dabei dynamisch auf andere Felder des Formulars beziehen und so die Auswahl in Echtzeit anpassen.
Anlegen und Anpassen des Felds
Zwei Wege, Domain-Felder einzusetzen: No-Code per Odoo Studio oder technische Anpassung per Modul.
Arbeiten mit Odoo Studio
Odoo Studio bietet aktuell kein eigenes Interface-Element, um direkt ein Domain-Feld zu erzeugen. Meistens ist das aber nicht nötig: Die eingebauten Domain-Editoren in Automatisierungen, Record-Rules und Serveraktionen reichen in vielen Fällen aus.
Wollen Sie auf einem Formular eine Domain für ein Many2one-Feld setzen, geht das in Studio über die Eigenschaften des Feldes: Dort können Sie eine Domain eintragen; Studio prüft die Syntax und speichert die Regel in der View-Definition.
Technische Anpassung in Python
In einem eigenen Modul ist das Hinzufügen eines Domain-Felds ein normaler Schritt in der Modell-Definition. Das Entwicklerhandbuch beschreibt das Vorgehen, hier ein einfaches Beispiel mit dem 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'
)
Das Attribut model_field verbindet den Domain-Editor mit dem Feld, das den Modellnamen enthält. So weiß das Widget, welche Felder es zur Auswahl anbietet; außerdem ermöglicht die Trennung von Modellname und Domain dynamische Einsatzszenarien.
Widget in der Formularansicht anzeigen
Um den visuellen Builder im Formular zu zeigen, referenzieren Sie sowohl das Modell-Feld als auch das Domain-Feld in der XML-View:
<field name="model_name" invisible="1"/>
<field name="filter_domain" widget="domain"
options="{'model': 'model_name'}"/>
Fehlt die Angabe widget="domain" oder die Model-Option, rendert Odoo das Feld als normalen Text. Immer beides angeben, wenn Nutzer Domains per UI pflegen sollen.
Domain per XML-RPC schreiben
Wenn Sie Domain-Werte über die API setzen, müssen Sie die Domain als string übergeben, nicht als Python-Liste.
models.execute_kw(db, uid, api_key, 'my.model', 'write',
[[record_id], {
'filter_domain': "[('active', '=', True)]"
}]
)
Eine häufige Fehlerquelle ist, eine echte Python-Liste statt des serialisierten Strings zu übergeben — das führt zu Type-Fehlern oder stillen Fehlschlägen, je nach Odoo-Version. Seriell übergeben, klappt es zuverlässig.
Empfohlene Vorgehensweisen
Diese praktischen Gewohnheiten sparen Zeit und verhindern Ärger beim Umgang mit Domain-Feldern.
Validieren Sie Domains vor dem Deployment
Ungültige Domains werfen Fehler beim Auswerten. Testen Sie deshalb neue Domains im Suchfeld oder im Entwicklermodus, bevor Sie sie in Automatisierungen oder Record-Rules speichern. Ein schneller search_count-Aufruf über die API ist ein guter Test, ob die Domain die erwartete Trefferzahl zurückgibt.
Nutzen Sie dynamische Variablen
Vermeiden Sie harte Kodierung von Benutzer- oder Firmen-IDs und festen Datumswerten in Domains. Variablen wie uid, context_today() oder current_company_id machen Domains portabel und robust gegenüber Datenbankwechseln.
Binden Sie immer den Modellkontext
Wenn Sie ein Domain-Feld in ein eigenes Modell aufnehmen, setzen Sie model_field und fügen Sie es in die View ein. Ohne Modellkontext sehen Anwender nur ein Textfeld – das erschwert die Nutzung und erhöht Fehlerrisiken.
Halten Sie Domains lesbar
Verschachtelte Domains mit vielen OR- und AND-Operatoren werden schnell unübersichtlich. Kommentieren Sie komplexe Filter in Ihrem Python-Code oder überlegen Sie, ob eine Serveraktion oder ein berechnetes Feld lesbarer und leichter testbar wäre.
Für programmgesteuerte Auswertung safe_eval nutzen
Wenn Sie Domain-Strings in Ihrem Code auswerten — z. B. in Serveraktionen — verwenden Sie stets Odoos safe_eval statt Pythons eval. safe_eval ist sicherer, unterstützt Odoo-spezifische Variablen und entspricht der internen Auswertung.
Mit realistischen Daten testen
Prüfen Sie Domains gegen echte Datenbestände, bevor Sie sie produktiv schalten. Besonders bei Automatisierungen und Record-Rules kann ein falscher Filter sonst falsche Datensätze verarbeiten oder unbemerkt Benutzerzugriffe verhindern.
Häufige Fehlerquellen
Die häufigsten Fehler beim Umgang mit Domain-Feldern und wie Sie sie vermeiden
Feldtyp mit Domain-Syntax verwechseln
„Domain“ wird in Odoo zweifach verwendet: als Syntax zur Filterbeschreibung und als Feldtyp fields.Domain, der diese Syntax speichert. Viele Einsteiger verwechseln beides. Ein Domain-Feld ist nur der Speicherort; der Inhalt ist die eigentliche Filterlogik.
Liste statt String via API übergeben
Beim Schreiben per XML-RPC müssen Domain-Felder als String übergeben werden. Eine rohe Python-Liste führt zu Fehlern oder stillen Ausfällen. Domain vorher serialisieren.
Modellkontext im Widget fehlt
Fügen Sie ein Domain-Feld nie ohne Model-Angabe in die View ein. Ohne diese Information gibt es nur ein Textfeld statt des hilfreichen visuellen Builders — das erhöht Fehleranfälligkeit und Nutzerfrustration.
IDs hart kodiert in Domains
Direktes Referenzieren von Datensatz-IDs macht Domains brüchig: Löschen oder Migration dieser Datensätze führt zu Problemen. Verwenden Sie stattdessen dynamische Variablen oder relationale Abfragen, damit die Filter portabel bleiben.
Zu großzügige oder zu restriktive Record-Rule-Domains
Eine zu offene Record-Rule kann vertrauliche Daten freigeben; eine zu enge kann Datensätze unsichtbar machen. Testen Sie Record-Rules immer aus Sicht der Zielgruppe, nicht als Administrator, der Regeln umgeht.
Archivierte Datensätze vergessen
Odoo schließt standardmäßig archivierte Datensätze (wo active = False) aus Suchergebnissen aus. Fehlt die Berücksichtigung archivierter Einträge, entstehen unerwartete Lücken. Ergänzen Sie ggf. ('active','in',[True,False]), wenn Archiviertes mit einbezogen werden soll.
Fazit
Domain-Felder sind ein zentrales Bauteil, das viele Odoo-Funktionen zusammenhält. Ob Zugriffskontrolle, Automatisierungen, dynamische Dropdowns oder Dashboard-Filter: Domain-Ausdrücke sind das Rückgrat der Datensatzfilterung, und fields.Domain bietet einen sauberen, validierten Mechanismus, diese Logik im Datenmodell abzulegen.
Für Anwender macht das Widget Filter konfigurierbar ohne Programmierkenntnisse. Für Entwickler ersetzt fields.Domain unstrukturierte Char-Felder mit Widget-Override und schafft klarere Modelldefinitionen. Egal ob Sie in Odoo Studio arbeiten, ein eigenes Modul schreiben oder Workflows im UI konfigurieren — wer Domain-Felder versteht, kann Odoo deutlich flexibler nutzen.
Die beschriebenen Konzepte gelten über Odoo-Versionen und Module hinweg. Zeit, die Sie in das Verständnis von Domain-Feldern investieren, zahlt sich aus — weil sie überall in Odoo vorkommen.
Brauchen Sie Unterstützung bei Ihrer Odoo-Implementierung?
Das Unternehmen Dasolo unterstützt Firmen dabei, Odoo zu implementieren, anzupassen und zu optimieren. Ob es um automatisierte Abläufe, maßgeschneiderte Module oder die bessere Nutzung Ihrer bestehenden Odoo-Installation geht: Unser Team bringt das technische Know-how, damit Sie sicher vorankommen.
Wenn Sie Fragen zu Domain-Feldern oder anderen Odoo-Themen haben, kontaktieren Sie unsund wir schauen uns gerne Ihre Konfiguration an und geben konkrete Handlungsempfehlungen.