Wenn Sie Zeit mit der Konfiguration von Odoo verbracht haben, sind Ihnen wahrscheinlich Domain-Ausdrücke begegnet. Diese klammergefüllten Filterbedingungen erscheinen in Aktionsschaltflächen, automatisierten Regeln, Aufzeichnungsregeln und E-Mail-Vorlagen auf der gesamten Plattform. Aber nur wenige Menschen wissen, dass Odoo auch einen speziellen Domain-Feldtyp in seinem ORM bereitstellt, der speziell dafür entwickelt wurde, diese Ausdrücke als strukturierte Daten zu speichern und anzuzeigen.
Das Verständnis von Domain-Feldern ist wichtig, egal ob Sie ein Odoo-Entwickler sind, der benutzerdefinierte Module erstellt, oder ein Geschäftsanwender, der automatisierte Workflows konfiguriert. Dieser Leitfaden behandelt alles, von dem, was ein Domain-Feld tatsächlich speichert, bis hin zu praktischen Beispielen, Entwicklungstipps und den häufigsten Fehlern, die vermieden werden sollten.
Was ist das Domain-Feld in Odoo
In Odoo ist ein Domain eine Liste von Filterbedingungen, die verwendet wird, um Datensätze abzufragen. Es folgt einer spezifischen Syntax mit Tupeln und logischen Operatoren und entspricht direkt SQL WHERE-Klauseln, wenn Odoo eine Datenbankabfrage ausführt.
Ein typischer Domain-Ausdruck sieht so aus:
[('customer_rank', '>', 0), ('active', '=', True)]
Dies übersetzt sich zu: Alle Datensätze zurückgeben, bei denen customer_rank größer als 0 UND active wahr ist.
Das Domain-Feld (fields.Domain) ist ein Feldtyp im Odoo ORM, der diese Ausdrücke als strukturierte Daten innerhalb eines Datensatzes speichert. Im Gegensatz zu einem einfachen Textfeld bietet es eine integrierte Validierung und ein spezielles UI-Widget, das es Benutzern ermöglicht, Filterbedingungen visuell zu erstellen, ohne Code schreiben zu müssen.
Wie es in der Benutzeroberfläche erscheint
In der Odoo-Oberfläche wird ein Domain-Feld standardmäßig mit dem Domain-Editor-Widget dargestellt. Dieses Widget bietet einen visuellen Regel-Builder, in dem Benutzer ein Feld auswählen, einen Operator (gleich, enthält, größer als usw.) auswählen und einen Wert eingeben können. Es ist dieselbe Benutzeroberfläche, die Sie sehen, wenn Sie Zugriffsregeln oder Filterkriterien in automatisierten Aktionen konfigurieren.
In der Datenbank werden Domain-Werte als einfacher Text gespeichert, konkret als die String-Darstellung einer Python-Liste. Der Feldtyp kümmert sich transparent um Serialisierung und Validierung, sodass Entwickler mit sauberen Domain-Werten in Python arbeiten können, während die Speicherschicht den Rest übernimmt.
Dies ist Teil des umfassenderen Designs des Odoo-Datenmodells: Felder sind nicht nur Speichercontainer. Sie tragen semantische Bedeutung, UI-Verhalten und Validierungslogik in einer einzigen Definition.
Wie das Feld funktioniert
Das Domain-Feld integriert sich eng mit dem Odoo ORM und dem Datensatzfilterungssystem. Hier ist, was im Hintergrund passiert, wenn Sie eine Domain speichern und auswerten.
Speicherung und Darstellung
Wenn eine Domain in der Datenbank gespeichert wird, speichert Odoo sie als serialisierten String. Eine Domain, die Datensätze auf den Entwurfsstatus für den aktuellen Benutzer beschränkt, wird als Textwert gespeichert, den Odoo zur Abfragezeit auswertet. Die spezielle Variable uid wird zur Laufzeit auf die aktuelle Benutzer-ID aufgelöst, was dynamisches Filtern ohne Hardcoding von Werten ermöglicht.
Das Odoo ORM nimmt diesen String, wertet ihn sicher aus und wandelt ihn in eine SQL WHERE-Klausel um. Diese Auswertung erfolgt über safe_eval, das eine kontrollierte Teilmenge von Python-Ausdrücken zusammen mit Odoo-spezifischen Kontextvariablen unterstützt.
Das Domain-Widget
In der Odoo-Oberfläche verwenden Felder vom Typ fields.Domain standardmäßig das Domain-Widget. Dieses Widget präsentiert den Filter-Builder, den Sie in vielen Teilen von Odoo sehen. Benutzer können Bedingungen hinzufügen, sie mit AND- oder OR-Logik kombinieren und Ergebnisse anzeigen, ohne Code zu berühren.
Das Widget macht die Domainfelder für Geschäftsanwender wirklich zugänglich. Sie müssen die Domänensyntax nicht verstehen, um einen Filter zu konfigurieren. Der visuelle Builder übernimmt die Übersetzung für Sie.
Modellkontext
Ein Domainfeld kann mit einem bestimmten Modell verknüpft werden, das Odoo mitteilt, welche Felder im Domain-Builder angeboten werden sollen. Sie legen dies über das model_field-Attribut in der Felddefinition fest. Ohne einen Modellkontext fällt das Domain-Widget auf ein einfaches Texteingabefeld zurück, was für Endbenutzer weit weniger nützlich ist.
Diese Kontextbindung ist ein zentraler Bestandteil der Art und Weise, wie das Odoo-Framework Felddefinitionen mit dem UI-Verhalten verbindet. Das Feld kennt das Modell, das es filtert, und die Benutzeroberfläche passt sich entsprechend an.
Interaktion mit anderen Datensätzen
Domainfelder werden häufig zusammen mit relationalen Feldern verwendet, um einzuschränken, welche Datensätze in einem Many2one-Dropdown angezeigt werden, um festzulegen, welche Datensätze eine automatisierte Aktion anvisieren, oder um den Umfang eines Berichts oder Dashboards festzulegen. Der Domainausdruck fungiert als aktiver Filter, der auf ORM-Ebene angewendet wird, was bedeutet, dass er die Odoo-Sicherheitsregeln und Feldzugriffssteuerungen respektiert.
Geschäftsanwendungsfälle
Domainfelder erscheinen in nahezu jedem Odoo-Modul. Hier sind fünf Beispiele aus der Praxis, die zeigen, wie sie praktische Geschäftsabläufe vorantreiben.
1. Automatisierte Aktionen und E-Mail-Trigger
Wenn Sie eine automatisierte Aktion in Odoo konfigurieren (Einstellungen > Technisch > Automatisierung), definieren Sie eine Domain, um festzulegen, welche Datensätze die Aktion auslösen. Zum Beispiel könnte eine automatisierte E-Mail für überfällige Rechnungen nur auf gebuchte Rechnungen abzielen, die unbezahlbar und überfällig sind. Diese Domain wird direkt im base.automation-Modell in einem Domainfeld namens filter_domain gespeichert. Die Aktion wird nur für Datensätze ausgelöst, die übereinstimmen.
2. Datensatzregeln und Zugriffskontrolle
Die Sicherheitsdatensatzregeln von Odoo verwenden Domainfelder, um einzuschränken, welche Datensätze eine Benutzergruppe sehen oder bearbeiten kann. Eine Regel für das Verkaufsteam könnte die Sichtbarkeit auf Datensätze beschränken, die dem aktuellen Benutzerteam zugewiesen sind, und wird zur Abfragezeit ausgewertet. Dies bietet Ihnen eine Zeilenebene-Sicherheit, ohne benutzerdefinierten Code schreiben zu müssen. Jeder Filter auf jeder Datensatzregel in Odoo ist ein Domainausdruck, der in einem Domainfeld gespeichert ist.
3. Filterung von Beständen und Operationen
In der Lager- und Bestandsverwaltung verwenden geplante Aktionen und Nachbestellregeln Domänen, um bestimmte Produktkategorien, Standorte oder Bestandsniveaus anzusprechen. Eine automatisierte Nachbestellaktion kann auf lagerfähige Produkte mit einer verfügbaren Menge, die gleich oder unter einem Nachbestellpunkt liegt, beschränkt werden, um unnötige Verarbeitungen über Tausende von Datensätzen zu vermeiden.
4. CRM-Pipeline und Lead-Qualifizierung
Im CRM-Modul basieren die Automatisierung der Pipeline-Stufen, Aktivitätsregeln und die Zuweisung von Leads alle auf Domänenausdrücken, um Leads zu kategorisieren und zu qualifizieren. Benutzerdefinierte Regeln zur Zuweisung von Leads verwenden Domänen, um Leads dem richtigen Verkäufer basierend auf Land, Branche oder Deal-Größe zuzuordnen. Das Domänenfeld ist das, was diese Regeln konfigurierbar von der Benutzeroberfläche aus macht, anstatt für jedes neue Szenario Codeänderungen zu erfordern.
5. Dynamische Many2one-Dropdowns
In benutzerdefinierten Formularen steuert eine auf ein Many2one-Feld angewendete Domäne, welche Datensätze im Dropdown angezeigt werden. Die Einschränkung eines Lieferantenfelds, um nur aktive Lieferanten mit einem nicht-null Lieferantenrang anzuzeigen, schafft fokussiertere Benutzererlebnisse und reduziert Eingabefehler. Die Domäne kann sogar dynamisch sein und Werte aus anderen Feldern im selben Formular referenzieren, wodurch die verfügbaren Optionen basierend auf den Benutzerauswahlen geändert werden.
Erstellen oder Anpassen des Feldes
Es gibt zwei Hauptansätze zur Arbeit mit Domänenfeldern in Odoo: die Verwendung von Odoo Studio für No-Code-Anpassungen oder das Schreiben von Python und XML in einem benutzerdefinierten Modul.
Verwendung von Odoo Studio
Odoo Studio bietet derzeit keinen eigenständigen Domänenfeldtyp in seinem visuellen Feld-Generator an. Für die meisten geschäftlichen Konfigurationsbedürfnisse benötigen Sie keinen. Die vorhandenen Domäneneditoren, die in automatisierte Aktionen, Aufzeichnungsregeln und Serveraktionen integriert sind, bieten Ihnen den visuellen Domänen-Builder, ohne dass ein benutzerdefiniertes Feld erforderlich ist.
Wenn Sie einen Domänenfilter zu einem Many2one-Feld in einem Formular hinzufügen möchten, können Sie dies in Studio tun, indem Sie die Feldeigenschaften bearbeiten und einen Domänenausdruck direkt eingeben. Studio validiert die Domänensyntax und speichert sie in der Sichtdefinition.
Technische Anpassung in Python
In einem benutzerdefinierten Odoo-Modul ist das Hinzufügen eines Domänenfeldes ein einfacher Teil des standardmäßigen Odoo-Entwicklerhandbuchs. Hier ist ein einfaches Beispiel unter Verwendung des 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änenausdruck zur Filterung von Partnerdatensätzen'
)
Das model_field-Attribut verknüpft den Domänen-Editor mit dem Modellnamen, der in model_name gespeichert ist. Dies sagt dem Domänen-Widget, welche Felder im visuellen Builder angeboten werden sollen. Das Beibehalten des Modellnamens in einem separaten Feld ermöglicht auch eine dynamische Modellauswahl, falls Ihr Anwendungsfall dies erfordert.
Hinzufügen des Widgets zu einer Formularansicht
Um den Domänen-Builder in einer Formularansicht anzuzeigen, verweisen Sie sowohl auf das Modellfeld als auch auf das Domänenfeld im XML der Ansicht:
<field name="model_name" invisible="1"/>
<field name="filter_domain" widget="domain"
options="{'model': 'model_name'}"/>
Ohne die Deklaration widget="domain" und die Modelloption wird das Feld als einfacher Text dargestellt. Fügen Sie immer beides hinzu, wenn Sie Formulare erstellen, die die Domänenkonfiguration für Benutzer sichtbar machen.
Schreiben von Domänenwerten über die XML-RPC-API
Wenn Sie Domänenfeldwerte programmgesteuert über die API festlegen, übergeben Sie den Wert immer als Zeichenfolge:
models.execute_kw(db, uid, api_key, 'my.model', 'write',
[[record_id], {
'filter_domain': "[('active', '=', True)]"
}]
)
Das Übergeben eines Python-Listenobjekts anstelle einer Zeichenfolge ist ein häufiger Fehler, der je nach Odoo-Version zu Fehlern oder stillen Ausfällen führen kann. Serialisieren Sie Ihre Domäne immer in eine Zeichenfolge, bevor Sie sie über die API schreiben.
Best Practices
Diese praktischen Gewohnheiten werden Ihnen Zeit sparen und Probleme beim Arbeiten mit Domänenfeldern in Odoo verhindern.
Validieren Sie die Domänensyntax, bevor Sie sie bereitstellen
Ein ungültiger Domänenausdruck verursacht Fehler, sobald Odoo versucht, ihn auszuwerten. Testen Sie Ihre Domänen in der Odoo-Suchleiste oder im Entwicklermodus, bevor Sie sie in automatisierten Aktionen oder Aufzeichnungsregeln speichern. Ein schneller search_count-Aufruf über die API ist ebenfalls eine zuverlässige Möglichkeit, um zu bestätigen, dass eine Domäne die erwartete Anzahl von Datensätzen zurückgibt.
Verwenden Sie dynamische Variablen, wo immer möglich
Vermeiden Sie das Hardcodieren von Benutzer-IDs, Unternehmens-IDs oder Daten in Domänen-Ausdrücken. Verwenden Sie stattdessen dynamische Variablen wie uid, context_today() und current_company_id. Dies hält Ihre Domänen portabel und vermeidet stillschweigende Fehler, wenn sich Datensätze zwischen Umgebungen ändern.
Binden Sie immer den Modellkontext
Beim Hinzufügen eines Domainfeldes zu einem benutzerdefinierten Modell sollten Sie immer das Attribut model_field festlegen und es in der Ansicht einfügen. Ohne dies sehen die Benutzer ein einfaches Texteingabefeld anstelle des visuellen Domain-Builders, was die Benutzerfreundlichkeit verringert und die Wahrscheinlichkeit erhöht, dass ungültige Werte gespeichert werden.
Halten Sie Domänen lesbar
Komplexe verschachtelte Domänen, die | (ODER) und & (UND) Operatoren verwenden, können schwer zu lesen und zu warten sein. Fügen Sie Kommentare in Ihrem Python-Code hinzu, die die Absicht hinter jeder Domäne erklären. Wenn eine Domäne sehr komplex wird, überlegen Sie, ob eine Serveraktion oder ein berechnetes Feld klarer und einfacher zu testen wäre.
Verwenden Sie safe_eval für programmgesteuerte Auswertung
Beim Auswerten von Domänenzeichenfolgen in Python-Code, beispielsweise innerhalb einer Serveraktion oder automatisierten Aktion, verwenden Sie die integrierte safe_eval von Odoo anstelle von Python-nativem eval. Es ist sicherer, behandelt Odoo-spezifische Kontextvariablen korrekt und ist konsistent mit der Art und Weise, wie Odoo Domänen intern auswertet.
Testen Sie mit realistischen Daten
Überprüfen Sie immer, ob Ihre Domäne mit den erwarteten Datensätzen übereinstimmt, bevor Sie live gehen. Dies ist besonders wichtig für automatisierte Aktionen und Datensatzregeln, bei denen ein falscher Filter die falschen Datensätze verarbeiten oder den Benutzerzugang ohne sichtbare Warnung blockieren kann.
Häufige Fallstricke
Hier sind die häufigsten Fehler, die beim Arbeiten mit Domainfeldern in Odoo auftreten, und wie Sie sie vermeiden können.
Verwechslung des Feldtyps mit der Domänensyntax
Das Wort "Domain" hat in Odoo zwei verschiedene Bedeutungen. Es bezieht sich auf die Filtersyntax (eine Liste von Tupeln) und es bezieht sich auch auf fields.Domain, einen spezifischen ORM-Feldtyp, der diese Ausdrücke als Daten speichert. Neulinge in der Odoo-Anpassung verwechseln oft die beiden. Ein Domain-Feld ist ein Speichercontainer. Der Domain-Ausdruck ist die Filterlogik, die darin enthalten ist.
Eine Liste anstelle eines Strings über die API übergeben
Beim Schreiben in ein Domain-Feld über XML-RPC müssen Sie einen String übergeben, nicht ein Python-Listenobjekt. Das Übergeben der Domain als rohe Liste führt je nach Odoo-Version zu einem Typfehler oder einem stillen Fehler. Serialisieren Sie Ihre Domain immer zu einem String, bevor Sie sie über die API schreiben.
Fehlender Modellkontext im Widget
Wenn Sie ein Domain-Feld zu einer Formularansicht hinzufügen, ohne den Modellkontext in den Widget-Optionen anzugeben, sehen die Benutzer ein einfaches Texteingabefeld anstelle des visuellen Domain-Builders. Der Domain-Builder erscheint nur, wenn das Widget weiß, auf welches Modell verwiesen werden soll. Fügen Sie immer den model_field-Link in Ihrer Sichtdefinition hinzu.
Hardcodierte Datensatz-IDs in Domains
Domains, die direkt auf spezifische Datensatz-IDs verweisen, brechen stillschweigend, wenn diese Datensätze gelöscht werden oder wenn Sie die Konfiguration in eine neue Datenbank kopieren. Verwenden Sie dynamische Referenzen wie uid oder relationale Suchen, wo immer möglich, um Ihre Domains portabel zu halten.
Übermäßig breite oder restriktive Datensatzregel-Domains
Eine Datensatzregel-Domain, die zu permissiv ist, kann Datensätze für Benutzer sichtbar machen, die sie nicht sehen sollten. Eine, die zu restriktiv ist, kann Datensätze stillschweigend verbergen, ohne dem Benutzer eine Erklärung zu geben. Testen Sie immer die Datensatzregel-Domains aus der Perspektive der Zielbenutzergruppe, nicht des Administratorkontos, das alle Regeln umgeht.
Vergessen von archivierten Datensätzen
Standardmäßig schließt Odoo archivierte Datensätze (wo active = False) von den Suchergebnissen aus. Wenn Ihre Domain dies nicht berücksichtigt, können unerwartete Lücken in Ihren Daten auftreten. Fügen Sie ('active', 'in', [True, False]) hinzu, wenn Sie archivierte Datensätze in den Filterergebnissen einbeziehen müssen.
Fazit
Domain-Felder sind eines dieser Bausteine, die leise einen großen Teil davon antreiben, wie Odoo funktioniert. Von Zugriffskontrolle und automatisierten Aktionen bis hin zu dynamischen Dropdowns und Dashboard-Filtern sind Domain-Ausdrücke das Rückgrat der Datensatzfilterung in Odoo, und der fields.Domain-Typ bietet Entwicklern eine saubere, validierte Möglichkeit, diese Logik direkt im Odoo-Datenmodell zu speichern und darzustellen.
Für Geschäftsanwender macht das Domain-Widget die Filterkonfiguration ohne jeglichen Code zugänglich. Für Entwickler bringt der Domain-Feldtyp Klarheit in die Modelldefinitionen, die zuvor auf generischen Char-Feldern mit einer Widget-Überschreibung basierten. Egal, ob Sie in Odoo Studio arbeiten, ein benutzerdefiniertes Python-Modul schreiben oder automatisierte Workflows über die Benutzeroberfläche konfigurieren, das Verständnis dafür, wie Domain-Felder funktionieren, eröffnet eine Vielzahl von Möglichkeiten.
Die in diesem Leitfaden behandelten Konzepte gelten für alle Odoo-Versionen und -Module. Zeit, die Sie damit verbringen, Domain-Felder zu verstehen, ist gut investierte Zeit, denn sie sind in Odoo wirklich überall.
Brauchen Sie Hilfe bei Ihrer Odoo-Implementierung?
Dasolo hilft Unternehmen, Odoo für ihre spezifischen Geschäftsbedürfnisse zu implementieren, anzupassen und zu optimieren. Egal, ob Sie automatisierte Workflows einrichten, benutzerdefinierte Module erstellen oder versuchen, mehr aus Ihrer bestehenden Odoo-Installation herauszuholen, unser Team hat die technische Tiefe, um Ihnen zu helfen, mit Zuversicht voranzukommen.
Wenn Sie Fragen zu Domain-Feldern oder einem anderen Aspekt Ihrer Odoo-Implementierung haben, kontaktieren Sie uns. Wir schauen uns gerne Ihre Einrichtung an und weisen Sie in die richtige Richtung.