Zum Inhalt springen

Many2One-Feld in Odoo: Der umfassende Praxisleitfaden

Praktischer Leitfaden zum Many2one-Feld im Odoo-Datenmodell: von Grundfunktionen über Beziehungslogik bis hin zu technischen Anpassungen
6. März 2026 durch
Many2One-Feld in Odoo: Der umfassende Praxisleitfaden
Dasolo
| Noch keine Kommentare

Einleitung


Das Many2One-Feld bildet eine Dauerverbindung zwischen zwei Datensätzen: von genau einem Datensatz in Modell A zu genau einem Datensatz in Modell B. Jedes Mal, wenn ein Angebot mit einem Kunden verknüpft, ein Artikel einer Warengruppe zugeordnet oder eine Aufgabe einem Projekt zugewiesen wird, steht hinter dieser Verknüpfung ein Many2One. Für Entwickler, Berater und Power-User ist dieses Feld deshalb das Fundament eines sauberen Odoo-Datenmodells.


Aus betrieblicher Sicht sorgt das Many2One dafür, dass Odoo nicht aus isolierten Modulen, sondern aus einem vernetzten System besteht. Beziehungen sorgen dafür, dass Informationen von einem Dokument ins andere fließen, und Anwender schnell zwischen zugehörigen Datensätzen navigieren können, ohne die Datenbankstruktur zu kennen.


Dieser Leitfaden erklärt, welche Informationen ein Many2One speichert, wie es sich im ORM und in der Benutzeroberfläche verhält, welche Einstellungen und Konstrukte verfügbar sind (Studio, Python, API) und zeigt praxisnahe Beispiele aus CRM, Verkauf, Lager und Buchhaltung.

Was ist das Many2One-Feld in Odoo?


Im ORM ist ein Many2One ein Fremdschlüssel: ein Datensatz enthält die Referenz auf genau einen Datensatz eines anderen Modells. Die Bezeichnung Many2One beschreibt die Perspektive des aktuellen Modells: viele Datensätze hier verweisen auf einen Datensatz dort. Typische Beispiele sind mehrere Aufträge, die auf einen Kunden verweisen, oder viele Produkte, die einer Kategorie zugeordnet sind.


Auf Datenbankebene speichert das Many2One eine Ganzzahlspalte mit der ID des verknüpften Datensatzes. Steht bei einem Auftrag der Kunde mit ID 42, dann enthält die partner_id-Spalte der sale_order-Tabelle die Zahl 42. Odoo sorgt automatisch für die nötigen JOINs und zeigt im UI den Namen statt der Roh-ID an.


In der Oberfläche erscheint ein Many2One meist als Auswahlfeld mit Suchfunktion: Tippen genügt, und Odoo filtert passende Treffer in Echtzeit. Ausgewählt wird der Datensatz über seinen Anzeigenamen, nicht über die interne ID — das macht das Feld für Anwender besonders intuitiv.

So definiert ein Entwickler ein Many2One direkt im Python-Modell:


from odoo import fields, models

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    x_account_manager_id = fields.Many2one(
        comodel_name='res.users',
        string='Account Manager',
        ondelete='set null',
    )

Der Parameter comodel_name gibt das technische Zielmodell an. ondelete steuert das Verhalten, wenn der verlinkte Datensatz gelöscht wird: cascade (aktuellen Datensatz ebenfalls löschen), set null (Verknüpfung löschen) oder restrict (Löschen verhindern).


In Odoo Studio findet man das Feld unter Many2One im Feldkatalog. Studio führt durch die Auswahl des Zielmodells und legt das Feld an — ideal, wenn man Beziehungen ohne Code einrichten möchte.

Wie das Feld funktioniert


Beim Lesen im ORM liefert ein Many2One ein Recordset mit dem verknüpften Datensatz; ist kein Link gesetzt, ist das Recordset leer. In Python kann man dann direkt über Punktnotation auf Felder des verknüpften Datensatzes zugreifen:


order = self.env['sale.order'].browse(1)
customer_name = order.partner_id.name
customer_city = order.partner_id.city

Dieses Kettenzugreifen erspart manuelle JOINs oder zusätzliche SQL-Abfragen: das ORM übernimmt die Datenbankarbeit und liefert bequem die gewünschten Werte.

Bei Zugriffen über XML-RPC liefert ein Many2One meist eine Zweierliste: [ID, Anzeigename], etwa [42, "Acme Corp"]. Ist kein Wert gesetzt, kommt False zurück — wichtig beim Verarbeiten von API-Antworten.


Wichtige Feldattribute

Die folgenden Eigenschaften sind bei Many2One-Feldern zentral und werden am häufigsten konfiguriert:

  • comodel_name: Technischer Name des Zielmodells. Ein Pflichtfeld.
  • ondelete: Verhalten beim Löschen des referenzierten Datensatzes: 'cascade', 'set null' oder 'restrict'. Standard ist häufig 'set null'.
  • domain: Filterbedingung, die einschränkt, welche Ziel-Datensätze auswählbar sind (z. B. nur Kunden).
  • context: Zusätzliche Kontextwerte, die übergeben werden, wenn das Ziel geöffnet oder ein neuer Datensatz angelegt wird — praktisch zum Vorbefüllen.
  • required: Macht das Feld obligatorisch; Datensatz kann nicht gespeichert werden, solange das Feld leer ist.
  • readonly: Verhindert manuelle Änderungen; nützlich, wenn die Verknüpfung programmatisch gesetzt wird.
  • delegate: Bei True werden Felder des verknüpften Modells auf das aktuelle Modell „durchgereicht“. Das ist ein Mechanismus für Modell-Erweiterung und kein Standardrelationalfeld für gewöhnliche Verknüpfungen.

Darstellung in Views

Im Formular erscheint das Many2One als Such-/Auswahlfeld mit Lupe und Pfeil: per Tippfilter findet der Anwender Datensätze, über den Pfeil lässt sich der verknüpfte Datensatz direkt öffnen — sehr praktisch für die Navigation zwischen zusammengehörigen Dokumenten.


In Listen zeigt das Many2One den Anzeigenamen des referenzierten Datensatzes. Es lässt sich hervorragend als Gruppierungsmerkmal nutzen — z. B. Aufträge nach Kunde gruppieren — und ist damit ein starkes Werkzeug für Berichte und Übersichten.


Auch in Such- und Filterbereichen spielen Many2One-Felder eine große Rolle: sie sind Basis für gezielte Filter, Gruppierungen und Auswertungen (z. B. Pipeline nach verantwortlichem Mitarbeiter).


Die Gegenrichtung: One2Many

Jede Many2One-Beziehung hat eine natürliche Rückseite: das One2Many. Verweisen mehrere Aufträge per Many2One auf denselben Kunden, zeigt der Kunde über ein One2Many alle zugehörigen Aufträge an. Es ist empfehlenswert, beide Seiten zu modellieren — das One2Many fügt keine neue Datenbankspalte hinzu, sondern berechnet seine Inhalte aus den Many2One-Werten der Gegenmodelle.

Anwendungsfälle im Unternehmen


Praktische Beispiele aus dem Alltag


CRM: Leads an Vertriebsmitarbeiter binden

Im CRM verknüpft das Feld user_id Leads mit dem zuständigen Vertriebsmitarbeiter (res.users). Dadurch lassen sich Pipelines nach Verantwortlichen filtern, Konvertierungsraten pro Mitarbeiter ermitteln und Aufgaben in Massen zuweisen — ohne zusätzlichen Entwicklungsaufwand.


Verkauf: Aufträge, Kunden und Preisliste

Ein Auftrag enthält typischerweise partner_id (Kunde) und pricelist_id (Preisliste). Das Setzen des Kunden kann automatisch Preisliste, Zahlungsbedingungen und Lieferadresse füllen — gesteuert durch onchange-Logik, die auf dem Many2One-Wert basiert. So zeigt sich der Nutzen einer sauberen Datenstruktur besonders deutlich.


Lager: Produkte und Kategorien

Produkte sind über das Many2One-Feld categ_id einer Produktkategorie zugeordnet. Die Kategorie steuert wichtige Parameter wie Konten, Bewertungsmethoden und Lagerentnahmestrategien. Eine korrekte Kategoriezuteilung ist deshalb wichtig für die korrekte Buchhaltung und Lagerführung.


Buchhaltung: Buchungen und Journale

Buchungssätze verweisen per journal_id auf das zugehörige Journal. Das Journal bestimmt Nummernkreise, Art der Buchung und teilweise Standardkonten. Eine falsche Journalauswahl führt zu fehlerhaften Buchungen — deshalb ist das Many2One hier ein zentrales Kontrollinstrument.


Projektmanagement: Aufgaben und Projekte

Aufgaben gehören per project_id zu einem Projekt. Diese Verbindung definiert Workflow-Stages, Zugriffsrechte und die Zuordnung von Arbeitszeiten — für Dienstleister mit projektbasierter Abrechnung ist das Many2One die Basis für Abrechnung und Umsatzzuordnung.

Many2One erstellen oder anpassen


Wege, ein Many2One hinzuzufügen


Es gibt drei gängige Methoden, ein Many2One-Feld anzulegen — abhängig von Kenntnissen und Einsatzziel:

Ohne Code: Odoo Studio

  1. Odoo Studio ist das Low-Code-Tool für schnelle Anpassungen. So fügen Sie ein Many2One ohne Programmierung hinzu:
  2. Studio öffnen.
  3. Zur gewünschten Formularansicht navigieren.
  4. Ein Many2One-Feld aus dem Feldkatalog auf das Formular ziehen.
  5. Im Eigenschaftenfenster das Zielmodell auswählen und optional eine Domain setzen.
  6. Beschriftung setzen und Studio schließen.

Studio legt das Feld mit einem x_studio_-Prefix an und fügt es dem View hinzu. Das Feld ist sofort einsatzbereit — eine schnelle Lösung für geschäftliche Anpassungen ohne Entwickleraufwand.


Per Python in einem Modul

Für dauerhafte, versionierbare Anpassungen definieren Entwickler Many2One-Felder in einem Custom-Modul. Das ist der Standardweg für produktive Umgebungen:


from odoo import fields, models

class ProjectTask(models.Model):
    _inherit = 'project.task'

    x_client_contact_id = fields.Many2one(
        comodel_name='res.partner',
        string='Client Contact',
        domain=[('type', '=', 'contact')],
        ondelete='set null',
        help='The main contact at the client for this task.',
    )

Nach der Definition das Feld in die passenden Views einfügen und das Modul upgraden. So haben Sie vollständige Kontrolle über Domain, ondelete-Verhalten und die Möglichkeit, Rechner-Methoden oder Constraints einzubauen.


Gleichzeitig empfiehlt es sich, die inverse One2Many-Seite zu ergänzen, damit Anwender in beide Richtungen navigieren können:


class ResPartner(models.Model):
    _inherit = 'res.partner'

    x_task_ids = fields.One2many(
        comodel_name='project.task',
        inverse_name='x_client_contact_id',
        string='Related Tasks',
    )

Per XML-RPC API

Wenn Sie Anpassungen programmatisch von außen vornehmen (Skripte, Remote-Konfiguration), können Many2One-Felder auch über die API angelegt werden:


field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_client_segment_id',
        'field_description': 'Client Segment',
        'model_id': model_id,
        'ttype': 'many2one',
        'relation': 'res.partner.category',
        'on_delete': 'set null',
        'state': 'manual',
    }]
)

Wichtig: relation gibt das Zielmodell an, on_delete das Löschverhalten. Erstellen Sie, wenn möglich, auch die inverse One2Many, damit die Navigation in beiden Richtungen funktioniert — das ist Teil solider Remote-Konfigurationen.

Best Practices


1. Immer die Gegenrichtung anlegen

Wenn Sie ein Many2One anlegen, ergänzen Sie das passende One2Many im Zielmodell. Es kostet keine zusätzliche Spalte und macht das Auffinden verwandter Datensätze aus dem Zielformular heraus deutlich einfacher.


2. Domain-Filter nutzen

Standardmäßig stehen bei z. B. res.partner alle Partner zur Auswahl — Kunden, Lieferanten, interne Kontakte. Wenn nur Kunden relevant sind, setzen Sie eine Domain wie [('customer_rank','>',0)], um die Auswahl zu beschränken und Fehlverknüpfungen zu vermeiden.


3. ondelete weise wählen

ondelete beeinflusst Datenintegrität: 'cascade' kann unerwartet viele Datensätze löschen, 'set null' ist in vielen Fällen sicherer, weil Verknüpfungen nur aufgehoben werden, und 'restrict' verhindert das Löschen, wenn noch Referenzen bestehen.


4. Keine Daten duplizieren

Anstatt Namen in einem Char-Feld zu duplizieren, sollten Sie auf Many2One verweisen. Duplikate erschweren Filter, Auswertungen und Pflege — ändern sich Namen, entstehen Inkonsistenzen. Verknüpfungen erhalten Datenkonsistenz und Wiederverwendbarkeit.


5. Kontext zum Vorbefüllen nutzen

Mit context können Sie beim Anlegen eines neuen verknüpften Datensatzes Standardwerte setzen (z. B. Projekt vorausfüllen), was Tippaufwand reduziert und die Datenqualität erhöht.

Häufige Fehlerquellen


Fehlende inverse One2Many

Das häufigste Versäumnis ist, das One2Many nicht anzulegen. Das führt zu einseitigen Beziehungen: vom Kind aus sieht man die Referenz, vom Eltern-Datensatz aus fehlen Listen aller zugehörigen Objekte — Anwender vermissen diese Übersicht schnell.


Unbedachtes cascade-Löschen

ondelete='cascade' ohne Prüfung kann katastrophal sein: Löscht man eine Warengruppe, könnten alle zugeordneten Produkte mitverschwinden. In den meisten Geschäftsprozessen sind 'set null' oder 'restrict' sicherere Alternativen.


Nicht auf None/False prüfen beim Zugriff

Wenn ein Many2One leer ist, liefert der ORM ein leeres Recordset. Auf direkte Ketten wie order.partner_id.country_id.name sollte geprüft werden, ob Zwischenschritte gesetzt sind — sonst entstehen leere Strings oder stille Fehler in Berichten.


Auf das falsche Modell verweisen

res.partner vereint Kunden, Lieferanten und Kontakte. Ohne passende Domain sehen Anwender unerwünschte Optionen im Dropdown. Definieren Sie die Domain passend zur beabsichtigten Nutzung des Feldes.


Many2One zu häufig einsetzen

Wenn die Auswahlmenge fix und klein ist, reicht häufig ein Selection-Feld; Many2One bedeutet ein eigenes Modell und zusätzliche JOINs. Für statische Statuswerte mit wenigen Optionen ist Selection oft performanter und einfacher.

Fazit


Das Many2One verbindet Odoo-Module und ist deshalb für alle Stakeholder relevant: Entwickler, Berater, Power-User und Business-Analysten profitieren davon, wenn sie wissen, wie und wann man es einsetzt.


Kernbotschaften: Legen Sie immer die inverse One2Many an, nutzen Sie Domains, wählen Sie ondelete bewusst und vermeiden Sie Many2One, wenn ein Selection-Feld ausreichend ist.


Egal ob Sie mit Studio konfigurieren, ein Python-Modul schreiben oder über die API arbeiten — relationalen Feldern von Anfang an sauber aufzusetzen macht Ihre Odoo-Installation stabiler und leichter wartbar.

Bei Dasolo unterstützen wir Unternehmen dabei, Odoo in allen Abteilungen einzusetzen, anzupassen und zu optimieren. Ob Datenmodell-Design, relationale Felder in Formularen oder komplette Module — unser Team begleitet Sie. Kontaktieren Sie uns und sprechen wir über Ihr Odoo-Projekt.

Many2One-Feld in Odoo: Der umfassende Praxisleitfaden
Dasolo 6. März 2026
Diesen Beitrag teilen
Anmelden , um einen Kommentar zu hinterlassen