Einführung
Wenn Sie Zeit damit verbracht haben, im Odoo-Datenmodell zu arbeiten, sind Sie wahrscheinlich auf Situationen gestoßen, in denen Sie einen Wert aus einem verknüpften Datensatz direkt in einem Formular anzeigen müssen, ohne den Benutzer zu bitten, zu einem anderen Modell zu klicken. Das Verknüpfte Feld ist die Lösung von Odoo, um dies auf eine saubere, deklarative Weise zu erreichen.
Anstatt ein berechnetes Feld mit einer Python-Methode zu schreiben, liest ein Verknüpftes Feld einfach durch eine bestehende relationale Kette und gibt den Wert am Ende davon aus. Es ist eines der nützlichsten Werkzeuge im Odoo-Entwicklerhandbuch und auch für Unternehmensberater zugänglich, die mit Odoo Studio arbeiten und kontextbezogene Informationen ohne Programmierung bereitstellen müssen.
Dieser Leitfaden erklärt, was das Verknüpfte Feld speichert, wie es im Odoo-Framework funktioniert, wie man es über Studio oder Python erstellt und konfiguriert und wo es in realen Geschäftsabläufen passt.
Was ist das Verknüpfte Feld in Odoo
Im Odoo ORM ist ein Verknüpftes Feld kein eigenständiger Feldtyp wie Float oder Char. Stattdessen ist es ein Shortcut, der ein Feld aus einem anderen Modell zugänglich macht, indem es einer Kette relationaler Felder folgt. Das Verknüpfte Feld übernimmt den Typ des Feldes, auf das es am Ende der Kette verweist.
Das einfachste Beispiel: Ein Verkaufsauftrag hat ein partner_id-Feld (ein Many2one, das auf res.partner verweist). Ein als related='partner_id.country_id' definiertes Verknüpfungsfeld würde das Kundenland direkt im Verkaufsauftrag anzeigen, ohne eine separate Kopie davon zu speichern.
Aus der Sicht des Benutzers sieht ein Verknüpfungsfeld genau wie jedes andere Feld in der Formularansicht aus. Wenn das terminale Feld in der Kette ein Char ist, wird das Verknüpfungsfeld als Texteingabe dargestellt. Wenn es ein Many2one ist, wird es als Dropdown angezeigt. Wenn es ein Boolean ist, wird es als Kontrollkästchen angezeigt. Das Verknüpfungsfeld erbt die visuelle Darstellung des Feldes, das es spiegelt.
Standardmäßig sind Verknüpfungsfelder schreibgeschützt und nicht im Datenbank gespeichert. Das bedeutet, dass sie immer den aktuellen Wert aus dem Quell-Datensatz anzeigen, aber Sie können Datensätze nicht direkt in einem Domain filtern oder suchen, es sei denn, Sie setzen store=True.
In Odoo Studio ist das Verknüpfungsfeld verfügbar, wenn Sie ein neues Feld zu einem Formular hinzufügen. Sie wählen einen bestehenden relationalen Pfad aus, und Studio erstellt das Feld mit der entsprechenden Konfiguration. Dies macht es zu einem der praktischeren Odoo Studio-Felder für Berater, die Formulare anreichern müssen, ohne Python zu schreiben.
Wie das Feld funktioniert
Wenn Odoo ein Verknüpfungsfeld liest, folgt es der Kette von Feldnamen, die durch Punkte getrennt sind. Jeder Schritt in der Kette (außer dem letzten) muss ein relationales Feld sein: ein Many2one, One2many oder Many2many. Das letzte Feld in der Kette kann jeden Typ haben.
Hier ist ein einfaches Beispiel für ein in einem Python-Modul definiertes Verknüpfungsfeld:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
partner_country_id = fields.Many2one(
related='partner_id.country_id',
string='Kundenland',
store=True,
)
In diesem Beispiel folgt Odoo partner_id, um den res.partner-Datensatz zu erreichen, und liest dann country_id daraus. Das Ergebnis ist ein Many2one-Feld im Verkaufsauftrag, das das Kundenland spiegelt.
Gespeicherte vs. Ungespeicherte Verknüpfungsfelder
Dies ist die wichtigste Unterscheidung, die zu verstehen ist. Standardmäßig hat ein Verknüpfungsfeld store=False, was bedeutet, dass es jedes Mal, wenn der Datensatz gelesen wird, dynamisch berechnet wird. Der Wert lebt nicht in der Datenbanktabelle für das Modell.
Mit store=True schreibt Odoo den Wert in die Datenbankspalte, wenn sich der Quell-Datensatz ändert. Dies ermöglicht das Filtern, Gruppieren und Suchen im Verknüpfungsfeld, was es für Berichte und Listenansichten viel nützlicher macht.
Der Nachteil ist, dass gespeicherte Verknüpfungsfelder Datenbankplatz verbrauchen und einen Aktualisierungs-Trigger benötigen, wann immer sich die Quelle ändert. Odoo verwaltet dies automatisch über sein Abhängigkeitsverfolgungssystem, aber es ist wichtig, sich dessen bewusst zu sein, insbesondere bei leistungsintensiven Modellen mit vielen Datensätzen.
Schreibgeschützte vs. beschreibbare verwandte Felder
Standardmäßig sind verwandte Felder schreibgeschützt. Durch Hinzufügen von readonly=False wird das Feld bearbeitbar. Wenn ein Benutzer den Wert ändert, schreibt Odoo ihn über die Kette zurück in den Quell-Datensatz. Dies ist ein mächtiges, aber potenziell überraschendes Verhalten: Das Bearbeiten des verwandten Feldes in einer Verkaufsbestellung ändert tatsächlich den Partnerdatensatz, nicht die Bestellung selbst.
Verwenden Sie beschreibbare verwandte Felder nur, wenn Sie tatsächlich dieses Schreibdurchlaufverhalten beabsichtigen. Es kann in einigen Kontexten sehr nützlich sein, wie z. B. in einem Schnellbearbeitungsfeld in einer Listenansicht, kann jedoch auch zu unbeabsichtigten Datenänderungen führen, wenn Benutzer nicht verstehen, was sie bearbeiten.
Wichtige Feldattribute
Dies sind die Hauptparameter, die Sie für ein verwandtes Feld konfigurieren:
- related: Die durch Punkte getrennte Kette von Feldnamen (z. B.
'partner_id.country_id'). Dies ist das einzige erforderliche Attribut. - store: Auf
Truesetzen, um den Wert in der Datenbank zu speichern. Ermöglicht Filtern und Gruppieren. - readonly: Auf
Falsesetzen, um Benutzern das Bearbeiten des Feldes zu erlauben, was in den Quell-Datensatz schreibt. - string: Das Label, das den Benutzern angezeigt wird. Standardmäßig das Label des terminalen Feldes.
- depends: Normalerweise nicht erforderlich, da Odoo Abhängigkeiten automatisch aus der
related-Kette ableitet. Nur in Ausnahmefällen erforderlich.
Wie es mit dem Odoo ORM interagiert
Das Lesen eines verwandten Feldes gibt den Wert des terminalen Feldes im verknüpften Datensatz zurück. Wenn irgendein Link in der Kette leer ist (zum Beispiel, wenn partner_id nicht gesetzt ist), gibt das verwandte Feld False zurück. Dies ist das standardmäßige Verhalten des Odoo ORM und gilt für alle relationalen Felder im Odoo-Datenmodell.
Verwandte Felder werden in Domänen, Ansichten und Berichten vollständig unterstützt, wenn sie gespeichert sind. Ungespeicherte Verwandte Felder können in Formular- und Listenansichten angezeigt werden, können jedoch nicht als Filterkriterien in einer Suchdomäne verwendet werden, es sei denn, der Server bewertet sie in Python anstelle von SQL.
Geschäftliche Anwendungsfälle
Verwandte Felder erscheinen in nahezu jedem Teil einer Odoo-Implementierung. Hier sind fünf praktische Beispiele aus realen Geschäftsabläufen.
CRM und Vertrieb: Kunden-Telefonnummer auf Verkaufsaufträgen
Eine häufige Anfrage von Vertriebsteams ist es, die Telefonnummer des Kunden direkt im Verkaufsauftrag-Formular zu sehen, ohne die Kundenakte separat öffnen zu müssen. Ein als related='partner_id.phone' definiertes Verwandtes Feld auf sale.order löst dies sofort. Es zeigt die Telefonnummer im Kontext an, beschleunigt Verkaufsanrufe und erfordert keinen zusätzlichen Entwicklungsaufwand. In Odoo Studio kann ein Berater dies in weniger als einer Minute mit der Option Verwandtes Feld hinzufügen.
Buchhaltung: Unternehmenswährung auf Rechnungszeilen
In Multi-Company-Odoo-Setups müssen Buchhalter manchmal die Unternehmenswährung direkt auf Rechnungszeilen zur Klarheit der Berichterstattung anzeigen. Ein Verwandtes Feld wie related='move_id.company_id.currency_id' verknüpft über zwei Many2one-Felder, um zur Währung zu gelangen. Diese dreistufige Kette ist gültig, obwohl es im Allgemeinen empfohlen wird, Ketten kurz zu halten, um die Leistung zu verbessern. Das Speichern dieses Feldes ermöglicht das Filtern von Rechnungen nach Unternehmenswährung in analytischen Berichten.
Lager: Produktkategorie auf Lagerbewegungszeilen
Lagerteams, die Lagerbewegungen verwalten, müssen oft die Produktkategorie sehen, ohne jede Produktakte zu öffnen. Ein Verwandtes Feld auf stock.move.line, das auf product_id.categ_id verweist, zeigt die Kategorie direkt auf der Bewegungszeile an. Mit store=True ermöglicht dies das Gruppieren von eingehendem und ausgehendem Lager nach Produktkategorie in den Lagerberichtsansichten, was besonders nützlich für Unternehmen ist, die eine breite Palette von Produktfamilien verwalten.
Produktion: Interne Referenz auf Arbeitsauftragskomponenten
Produktionsleiter in Fertigungsunternehmen müssen häufig die interne Produktreferenz auf den Komponentenlinien des Arbeitsauftrags während der Produktion sehen. Ein Verwandtes Feld, das product_id.default_code auf mrp.workorder-Zeilen liest, platziert die Referenznummer genau dort, wo der Bediener sie benötigt, wodurch Fehler beim Auswählen ähnlicher Produkte reduziert werden. Diese Art von kleiner Anpassung hat einen echten Einfluss auf die Genauigkeit am Produktionsstandort.
Stundenzettel und Projekte: Abteilung des Mitarbeiters
Wenn Projektmanager die Stundenzettelzeilen überprüfen, müssen sie manchmal sehen, zu welcher Abteilung der Mitarbeiter gehört, um die Kosten zuzuordnen. Ein als related='employee_id.department_id' definiertes Verwandtes Feld auf account.analytic.line (dem Stundenzettelmodell) zeigt die Abteilung direkt im Stundenzettel-Eintrag an. Mit store=True ermöglicht es das Filtern von Stundenzetteln nach Abteilung in Projektanalyseberichten, wodurch Odoo ein vollständigeres Projektmanagement- und Ressourcenallokationstool wird.
Erstellen oder Anpassen des Verknüpften Feldes
Es gibt drei Hauptmethoden, um ein Verknüpftes Feld zu einem Odoo-Modell hinzuzufügen, abhängig von Ihrem technischen Kontext und wie das Deployment verwaltet wird.
Verwendung von Odoo Studio (Keine Programmierung)
Odoo Studio ermöglicht es Ihnen, Verknüpfte Felder hinzuzufügen, ohne Python zu schreiben. So geht's:
- Öffnen Sie Odoo Studio aus dem Hauptmenü.
- Navigieren Sie zu dem Formular, in das Sie das Feld hinzufügen möchten.
- Klicken Sie auf Feld hinzufügen und wählen Sie Verknüpftes Feld.
- Wählen Sie den relationalen Pfad aus, indem Sie schrittweise durch die verfügbaren Felder klicken.
- Geben Sie dem Feld ein Label und konfigurieren Sie, ob es gespeichert oder schreibgeschützt sein soll.
- Speichern und schließen Sie Studio.
Studio erstellt automatisch das Feld mit einem x_studio_-Präfix und platziert es in der Ansicht. Dies ist eine der effizientesten Methoden, um Odoo Studio-Felder zu nutzen, um kontextuelle Informationen zu bestehenden Formularen hinzuzufügen. Es sind keine Datenbankänderungen Ihrerseits erforderlich.
Verwendung von Python in einem benutzerdefinierten Modul
Für Entwickler, die an der Anpassung von Odoo durch Code arbeiten, werden Verknüpfte Felder in der Modellklasse definiert. Dies ist der Ansatz, der im Odoo-Entwicklerhandbuch für alle Änderungen empfohlen wird, die Versionskontrolle und Multi-Umgebungs-Deployment benötigen:
from odoo import fields, models
class StockMoveLine(models.Model):
_inherit = 'stock.move.line'
product_category_id = fields.Many2one(
related='product_id.categ_id',
string='Produktkategorie',
store=True,
)
Nachdem das Feld definiert wurde, fügen Sie es der entsprechenden Ansicht XML hinzu, damit es in der Benutzeroberfläche erscheint. Odoo kümmert sich automatisch um die Erstellung der Datenbankspalte während der Modulinstallation oder -aktualisierung. Dies ist der Standardansatz für die Entwicklung in Odoo für zuverlässige, wartbare Odoo-Anpassungen.
Verwendung der XML-RPC-API
Für programmgesteuerte Bereitstellungen, beispielsweise über ein entferntes Konfigurationsnotizbuch, können verwandte Felder über die XML-RPC-API erstellt werden, indem das related-Attribut in der Felddefinition gesetzt wird:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_partner_country_id',
'field_description': 'Kundenland',
'model_id': sale_order_model_id,
'ttype': 'many2one',
'relation': 'res.country',
'related': 'partner_id.country_id',
'store': True,
'readonly': True,
'state': 'manual',
}]
)
Beim Erstellen eines verwandten Feldes über die API müssen Sie den richtigen ttype und relation manuell angeben, da die API den Typ nicht automatisch aus der Kette ableitet, wie es das Python ORM tut. Dies ist der Ansatz, den Dasolo verwendet, um Odoo-Feldanpassungen remote über automatisierte Konfigurationsskripte bereitzustellen.
Best Practices
1. Speichern Sie das Feld, wenn Filterung oder Gruppierung erforderlich ist
Wenn Benutzer eine Listenansicht nach dem verwandten Feld filtern oder Datensätze in einer Pivot-Tabelle gruppieren müssen, fügen Sie store=True hinzu. Ohne dies ist eine Filterung auf Datenbankebene nicht möglich, und Odoo müsste alle Datensätze in Python laden, um den Filter anzuwenden, was nicht skalierbar ist. Für nur zur Anzeige gedachte Felder in Formularansichten ist nicht gespeichert vollkommen in Ordnung.
2. Halten Sie die Kette so kurz wie möglich
Eine zweistufige Kette wie partner_id.country_id ist sauber und leistungsfähig. Eine vierstufige Kette wie picking_id.sale_id.partner_id.country_id führt zu mehr potenziellen Fehlerquellen und ist schwieriger zu warten. Wenn Sie feststellen, dass Sie sehr tiefe Ketten erstellen, überlegen Sie, ob ein berechnetes Feld mit expliziter Python-Logik klarer und einfacher zu debuggen wäre.
3. Verstehen Sie, was readonly=False tatsächlich bedeutet
Ein schreibbares verwandtes Feld erstellt keine lokale Kopie der Daten. Es ändert den Quell-Datensatz. Wenn Sie partner_id.phone auf einem Verkaufsauftrag bearbeitbar machen, wird durch die Änderung der Partnerdatensatz in res.partner aktualisiert. Diese Änderung wirkt sich auf jedes andere Dokument aus, das mit diesem Partner verknüpft ist. Stellen Sie sicher, dass dies beabsichtigt ist, und informieren Sie die Benutzer immer, wenn ein Feld einen gemeinsamen Datensatz bearbeitet.
4. Verwenden Sie verwandte Felder zur Anzeige, nicht zur Datenverdopplung
Verwandte Felder sollen vorhandene Daten im Kontext anzeigen, nicht sie zu duplizieren. Wenn Sie das Bedürfnis haben, eine unabhängige Kopie eines Wertes zu haben, die sich von der Quelle unterscheiden kann, ist ein reguläres Feld mit einem Standardwert, der durch eine onchange- oder automatisierte Aktion gesetzt wird, der richtige Ansatz, nicht ein verwandtes Feld mit store=True und readonly=False.
5. Überprüfen Sie die Auswirkungen der Zugriffsrechte
Ein verwandtes Feld liest durch ein anderes Modell. Wenn der aktuelle Benutzer keinen Lesezugriff auf dieses Modell hat, kann das Feld stillschweigend einen leeren Wert zurückgeben. Dies ist das korrekte Sicherheitsverhalten von Odoo, kann jedoch Benutzer verwirren, die ein leeres Feld sehen, ohne zu verstehen, warum. Bei der Gestaltung von Formularen mit verwandten Feldern sollten Sie überprüfen, ob die erwarteten Benutzerrollen Lesezugriff auf alle Modelle in der Kette haben.
Häufige Fallstricke
Filtern eines nicht gespeicherten verwandten Feldes
Dies ist der häufigste Fehler. Ein Entwickler oder Berater fügt einem Listenansicht ein verwandtes Feld hinzu und versucht dann, einen Suchfilter darauf anzuwenden. Wenn store=False (der Standard) ist, kann Odoo auf Datenbankebene nicht nach diesem Feld filtern. Die Domain wird entweder einen Fehler auslösen oder stillschweigend keine Ergebnisse zurückgeben. Fügen Sie immer store=True zu jedem verwandten Feld hinzu, das Sie in Suchfiltern oder Gruppierungsbedingungen verwenden möchten.
Unerwartetes Durchschreibverhalten
Das Setzen von readonly=False auf einem verwandten Feld und dann überrascht zu sein, dass Änderungen das Quellrecord beeinflussen, ist ein sehr häufiges Problem, insbesondere wenn verwandte Felder durch Odoo Studio von Benutzern hinzugefügt werden, die mit den Mechanismen nicht vertraut sind. Bestätigen Sie immer mit den Geschäftsinteressierten, ob sie möchten, dass Änderungen zurück zum Quellmodell propagiert werden, bevor Sie ein verwandtes Feld bearbeitbar machen.
Nichtbehandlung leerer Zwischenfelder
Wenn ein Feld in der Kette leer ist, gibt das verwandte Feld False zurück. In einer Formularansicht bedeutet dies normalerweise, dass das Feld leer angezeigt wird. In einem berechneten Feld oder einer Python-Methode, die den Wert des verwandten Feldes liest, müssen Sie den False-Fall behandeln, um TypeErrors zu vermeiden. Dies ist leicht zu übersehen, wenn in Tests alle Datensätze vollständige Daten haben, tritt jedoch in der Produktion auf, wenn optionale Felder leer gelassen werden.
Verwendung von Verwandten, wo ein berechnetes Feld angemessener ist
Verwandte Felder funktionieren gut, wenn Sie ein einzelnes Feld durch eine relationale Kette spiegeln. Wenn Sie jedoch Logik, Transformation oder bedingtes Verhalten auf den Wert anwenden müssen, ist ein berechnetes Feld mit einer Python-Methode die richtige Wahl. Der Versuch, bedingte Logik durch eine verwandte Feldkette zu implementieren, führt zu Workarounds, die schwer zu warten und in zukünftigen Odoo-Upgrades leicht zu brechen sind. Dies ist ein häufiger Punkt in jedem technischen Odoo-Tutorial zu Feldtypen.
Leistungsprobleme mit vielen gespeicherten Verknüpfungsfeldern in großen Modellen
Jedes gespeicherte Verknüpfungsfeld erfordert ein Update, wenn sich der Quellwert ändert. Wenn Sie zehn gespeicherte Verknüpfungsfelder in einem Modell mit Hunderttausenden von Datensätzen hinzufügen und sich die Quellfelder häufig aktualisieren, können Sie eine erhebliche Schreiblast auf der Datenbank erzeugen. Bei der großangelegten Odoo-Entwicklung sollten Sie die Auswirkungen auf die Leistung von gespeicherten Verknüpfungsfeldern profilieren und bevorzugen Sie nicht gespeicherte, nur zur Anzeige dienende Felder, wenn die Echtzeitgenauigkeit nicht kritisch ist.
Fazit
Das Verknüpfungsfeld ist eines der praktischsten Werkzeuge im Odoo-Framework, um kontextbezogene Informationen bereitzustellen, ohne Daten zu duplizieren. Es ermöglicht Ihnen, durch relationale Ketten zu lesen, Werte aus verknüpften Datensätzen direkt in jeder Ansicht anzuzeigen und optional diese Werte für Filterung und Berichterstattung zu speichern.
Zu verstehen, wann store=True verwendet werden sollte, wann readonly=False angemessen ist und wie man mit leeren Zwischenfeldern umgeht, wird Ihnen Zeit sparen und die häufigsten Datenprobleme in Odoo-Implementierungen verhindern. Egal, ob Sie ein Entwickler sind, der Python-Module schreibt, ein Berater, der Odoo Studio verwendet, oder ein technischer Leiter, der remote Konfigurationen verwaltet, das Verknüpfungsfeld ist es wert, gut zu kennen.
Wenn Sie ein Odoo-Datenmodell erstellen oder erweitern, gehören Verknüpfungsfelder in Ihr Werkzeugset neben berechneten Feldern, Many2one-Feldern und den anderen Odoo-Feldtypen, die in dieser Reihe behandelt werden.
Bei Dasolo helfen wir Unternehmen, Odoo in den Bereichen Vertrieb, Betrieb, Buchhaltung und darüber hinaus zu implementieren, anzupassen und zu optimieren. Wenn Sie Hilfe bei der Gestaltung Ihres Odoo-Datenmodells, beim Hinzufügen benutzerdefinierter Felder zu Ihren Workflows oder beim Erweitern Ihrer Odoo-Installation mit zuverlässigem, wartbarem Code benötigen, sind wir hier, um zu helfen. Kontaktieren Sie uns und lassen Sie uns besprechen, wie wir Ihr Odoo-Projekt unterstützen können.