Zum Inhalt springen

One2many-Feld in Odoo: Der komplette Leitfaden

Ein One2many-Feld in Odoo verbindet einen Datensatz mit einer Liste verwandter Datensätze — man kann sich das vorstellen wie eine Hauptakte, die auf mehrere Unterakten verweist. Praktisch bedeutet das: ein Kunde (Hauptdatensatz) kann viele Bestellungen (untergeordnete Datensätze) haben. Technisch ist One2many ein relationaler Verweis, der typischerweise auf ein Many2one-Feld in der Zielmodell-Tabelle zeigt; das ist die Grundlage für die Synchronisation zwischen den beiden Seiten.
6. März 2026 durch
One2many-Feld in Odoo: Der komplette Leitfaden
Dasolo
| Noch keine Kommentare

Einführung


Wenn Sie schon einmal eine Verkaufsbestellung in Odoo geöffnet haben und unter den Kundendaten die Liste der Positionen gesehen haben, dann haben Sie das One2many-Feld bereits benutzt. Dieses Feld bildet häufige Vater‑/Kind‑Beziehungen in der Datenstruktur ab und ist deshalb für Entwickler wie Anwender gleichermaßen wichtig.


Dieser Leitfaden erklärt in verständlichen Schritten, was ein One2many‑Feld ist, wie es im Odoo‑ORM funktioniert, in welchen Fällen es sinnvoll ist und wie Sie es entweder mit Odoo Studio oder per Python‑Modul anlegen und konfigurieren können.

Ob Sie als Anwender die Datenstruktur Ihres Systems nachvollziehen wollen oder als Entwickler eine praktische Anleitung für Felder in Odoo suchen — dieser Beitrag liefert das notwendige Grundlagenwissen.

Was ist das One2many-Feld in Odoo?


Ein One2many ist in Odoo ein relationales Feld, das eine einzelne Eltern‑Entität mit mehreren Tochter‑Datensätzen eines anderen Modells verknüpft.


Anschaulich: Eine Firma hat viele Rechnungen; eine Bestellung enthält mehrere Positionen; ein Projekt besteht aus zahlreichen Tasks. Das One2many‑Feld stellt die Sammlung dieser zugehörigen Untereinträge dar.


In der Oberfläche erscheint ein One2many typischerweise als eingebettete Liste direkt innerhalb eines Formulars. Anwender können dort Unterelemente hinzufügen, bearbeiten oder entfernen, ohne das übergeordnete Formular verlassen zu müssen — das macht One2many zu einer sehr sichtbaren und oft genutzten UI‑Komponente.


Abgrenzung zu anderen Beziehungsfeldern

Odoo kennt im Kern drei relationale Feldtypen:


  • Many2one: Ein Datensatz verweist auf genau einen Datensatz eines anderen Modells (z. B. eine Bestellung verweist auf einen Kunden).
  • One2many: Ein Datensatz ist mit mehreren Datensätzen eines anderen Modells verknüpft (z. B. eine Bestellung mit vielen Positionen).
  • Many2many: Beide Seiten können viele Verknüpfungen haben (z. B. ein Produkt mit mehreren Tags, und ein Tag mit mehreren Produkten).

Nutzen Sie One2many, wenn ein Kind stets genau zu einem Elternteil gehört. Falls derselbe Kind‑Datensatz mehreren Eltern zugeordnet werden soll, ist Many2many die richtige Wahl.


Ein Besonderheit des One2many ist: es speichert selbst keine Daten in der Elterntabelle. Es ist ein virtuelles Feld, das die zugehörigen Kind‑Datensätze über das Many2one‑Feld auf der Kindseite abruft.

Funktionsweise des Feldes


Konzeptionell existiert die Speicherung nicht im Eltern‑Record, sondern in der Kind‑Tabelle: dort liegt die Fremdschlüsselspalte, die auf die ID des Elternteils zeigt.


Grundprinzip im Odoo‑ORM: jedes One2many hat immer genau ein korrespondierendes Many2one auf dem verknüpften Modell. Das One2many ist praktisch eine Rückwärtssuche — Odoo findet alle Kind‑Datensätze, bei denen das Many2one auf die aktuelle Eltern‑ID zeigt.


Die Beziehung zwischen One2many und Many2one

Beim Anlegen eines One2many‑Feldes in Python geben Sie zwei entscheidende Parameter an:


  • comodel_name: das Modell, das die Kind‑Datensätze enthält.
  • inverse_name: der Name des Many2one‑Feldes auf dem Kindermodell, das zurück auf den Elterndatensatz zeigt.

Ein typisches Beispiel aus einer maßgeschneiderten Odoo‑Erweiterung: ein Service‑Vertrag, der mehrere Deliverables verwaltet.


deliverable_ids = fields.One2many(
    comodel_name='service.deliverable',
    inverse_name='contract_id',
    string='Deliverables'
)

In diesem Beispiel ist contract_id das Many2one‑Feld auf service.deliverable, das zum Vertrag zurückzeigt. Ohne dieses Many2one kann das One2many nicht funktionieren.


Was auf Datenbankebene passiert

In der Datenbank enthält die Elterntabelle kein Feld für das One2many. Die relevanten Daten stehen in der Tabelle des Kindermodells, jede Zeile dort hat eine Fremdschlüsselspalte zum Eltern‑Record.

Wenn Odoo einen Eltern‑Datensatz lädt und das One2many darstellen soll, erfolgt intern eine Abfrage: finde alle Zeilen in der Kindertabelle, deren Fremdschlüssel der aktuellen Eltern‑ID entspricht. Das ORM kümmert sich um diese Abfrage automatisch.


Deswegen zählt One2many zu den Python‑Feldtypen, die keine eigene Spalte zur Elterntabelle hinzufügen — es ist eine berechnete Sicht auf verwandte Datensätze.

Praxisbeispiele aus dem Alltag


One2many‑Felder sind in Odoo weit verbreitet, weil sie typische reale Parent‑Child‑Beziehungen modellieren. Nachfolgend fünf praxisnahe Anwendungsfälle.


1. Verkaufsaufträge und Positionen

Im Verkauf verbindet ein One2many‑Feld (z. B. order_line_ids auf sale.order) die Positionen (sale.order.line) mit der Bestellung. Jede Position enthält Produkt, Menge, Preis und Rabatte und lässt sich direkt im Bestellformular verwalten.


2. Rechnungen und Rechnungspositionen

In der Buchhaltung verwaltet das account.move Modell mittels One2many seine Rechnungspositionen (account.move.line). Die Gesamtsumme der Rechnung ergibt sich aus den einzelnen Zeilen des Kindes.


3. Projekte und Aufgaben

Das Projektmodul nutzt One2many, um alle Tasks zu einem Projekt zu listen. In Formularen kann das als Liste, Kanban oder Gantt angezeigt werden — alles basiert auf derselben One2many‑Beziehung.


4. Kontakte und Unterkontakte

Das Modell res.partner führt mit child_ids ein One2many, das die zu einer Firma gehörenden Ansprechpartner auflistet. Jeder Unterkontakt besitzt ein parent_id Many2one, das auf die Firma verweist.


5. Eigene Modelle in Service oder Produktion

Beim Erstellen eigener Module ist One2many das Mittel der Wahl, wenn ein Datensatz eine Liste von Sub‑Elementen besitzt — etwa ein Wartungsauftrag mit mehreren Ersatzteilen, ein Kurs mit mehreren Terminen oder ein Vertrag mit verschiedenen Deliverables.


Diese Vielseitigkeit macht das One2many zu einem zentralen Baustein bei Anpassungen und Branchenlösungen mit Odoo.

Anlegen und Anpassen des Feldes


Ein One2many‑Feld lässt sich entweder ohne Code über Odoo Studio anlegen oder durch Python‑Code in einem Custom‑Modul — beide Wege haben ihre Vor‑ und Nachteile.


Anlegen mit Odoo Studio

In Studio können Sie nicht direkt auf der Elternebene einfach ein One2many auswählen — weil zuvor das entsprechende Many2one auf dem Kind existieren muss.

Der empfohlene Ablauf in Studio besteht aus wenigen Schritten:

  1. Öffnen Sie zuerst das Kindermodell in Studio und legen Sie dort ein Many2one‑Feld an, das auf das Elternmodell verweist.
  2. Speichern Sie das Many2one, wechseln Sie zurück zum Elternmodell in Studio.
  3. Fügen Sie dort ein neues Feld vom Typ "One2many" hinzu. Studio fordert Sie auf, das Zielmodell (comodel) und das inverse Many2one auszuwählen.
  4. Danach erscheint das One2many als eingebettete Liste im Formular und kann von Anwendern genutzt werden.

Für viele Anwender ist das der einfachste Weg, One2many‑Beziehungen ohne Programmierung einzurichten. Studio‑Felder verhalten sich wie ihre Python‑Pendents.


Anlegen per Python in einem Custom‑Modul

Entwickler definieren One2many‑Felder in Python, wenn sie volle Kontrolle über Verhalten, Feldnamen oder Domains brauchen. Ein vollständiges Beispiel sieht so aus:


from odoo import fields, models

class ServiceContract(models.Model):
    _name = 'service.contract'
    _description = 'Service Contract'

    name = fields.Char(string='Contract Name', required=True)
    deliverable_ids = fields.One2many(
        comodel_name='service.deliverable',
        inverse_name='contract_id',
        string='Deliverables'
    )


class ServiceDeliverable(models.Model):
    _name = 'service.deliverable'
    _description = 'Service Deliverable'

    contract_id = fields.Many2one(
        comodel_name='service.contract',
        string='Contract',
        ondelete='cascade'
    )
    name = fields.Char(string='Description', required=True)

Wichtig: das Many2one (contract_id) muss auf dem Kind definiert sein, bevor das One2many mit inverse_name darauf verweist — die Namen müssen exakt übereinstimmen.


Anlegen per XML‑RPC‑API

Wenn Sie Felder programmatisch verwalten, lassen sich One2many‑Felder auch über die XML‑RPC‑Schnittstelle über das Modell ir.model.fields erstellen. Hier gilt dieselbe Regel: erst Many2one anlegen, dann One2many mit relation_field, das auf die Many2one‑Bezeichnung zeigt.


Diese Methode ist praktisch, wenn Sie Feldkonfigurationen über mehrere Instanzen hinweg automatisieren oder in Migrationsskripten anlegen möchten.

Empfohlene Vorgehensweisen


Aus Projekterfahrung mit verschiedenen Kunden haben sich einige Regeln als besonders nützlich erwiesen, wenn man regelmäßig mit One2many arbeitet.


  • Many2one zuerst anlegen. Ohne das inverse Many2one auf dem Kind ist ein One2many nicht möglich — das gilt in Studio, im Python‑Modul und per API.
  • Feldnamen mit _ids‑Suffix verwenden. Konventionell enden One2many‑Felder auf _ids (z. B. line_ids, task_ids), damit sofort klar ist, dass es sich um eine Sammlung von Datensätzen handelt.
  • ondelete='cascade' dort setzen, wo es Sinn macht. Wenn Kinddatensätze mitgelöscht werden sollen, wenn das Elternteil entfernt wird, aktivieren Sie diese Option im Many2one, um verwaiste Datensätze zu vermeiden.
  • Die eingebettete Liste schlank halten. Zeigen Sie nur relevante Spalten. Zu viele Felder in der One2many‑Ansicht machen Formulare langsam und unübersichtlich. Sekundäre Spalten können als optional markiert werden.
  • Domains nutzen, um Sichtbarkeit einzuschränken. Mit einer Domain im One2many können Sie steuern, welche Kinddatensätze angezeigt werden — hilfreich, wenn ein Kindermodell von mehreren Eltern geteilt wird.
  • Große Datenmengen bewusst behandeln. Wenn Eltern tausende Kinder haben können, vermeiden Sie das sofortige Laden aller Zeilen im Formular. Alternativen sind separate Listen, Pagination oder Filteransichten.

Typische Fehlerquellen


Die häufigsten Fehler im Umgang mit One2many‑Feldern


Fehlendes Many2one als Inverse

Der Klassiker: Entwickler versuchen, ein One2many anzulegen, ohne dass das entsprechende Many2one auf dem Kind existiert. Odoo meldet dann einen Fehler. Prüfen Sie immer, ob das angegebene inverse_name auf dem Kindermodell vorhanden ist.


Falsche Schreibweise beim Aktualisieren

Beim Schreiben von One2many‑Daten in Python oder über die API müssen die speziellen Odoo‑Command‑Tuples verwendet werden. Sie können nicht einfach eine normale Python‑Liste zuweisen.


  • (0, 0, values_dict) — einen neuen Kinddatensatz anlegen.
  • (1, child_id, values_dict) — bestehenden Kinddatensatz aktualisieren.
  • (2, child_id, 0) — bestehenden Kinddatensatz löschen.
  • (4, child_id, 0) — einen vorhandenen Datensatz zur Relation hinzufügen.
  • (5, 0, 0) — alle Kinddatensätze von der Relation entfernen (ohne sie zu löschen).

Eine Zuweisung wie record.line_ids = [1, 2, 3] funktioniert nicht korrekt — nutzen Sie die Command‑Syntax.


Verwechslung von One2many und Many2many

One2many bedeutet: ein Kind gehört genau zu einem Elternteil. Wenn ein Datensatz jedoch mehreren Eltern zugeordnet werden soll, verwenden Sie Many2many. One2many würde sonst zu Duplikaten und Inkonsistenzen führen.


Performance‑Probleme bei großen Unterlisten

Wenn Hunderte oder Tausende von Linien in einer eingebetteten Liste geladen werden, kann das Formular merklich langsamer werden — oft zu sehen in Rechnungen oder Lagerbewegungen. Begrenzen Sie die angezeigten Zeilen oder verweisen Sie auf eine separate Liste.


Verwaiste Datensätze nach Löschungen

Löschen Sie einen Eltern‑Datensatz ohne ondelete='cascade' auf dem Many2one, können Kinder mit ungültiger Referenz zurückbleiben. Solche verwaisten Datensätze führen langfristig zu Fehlern in Berichten und Ansichten — legen Sie klare Löschregeln fest.

Fazit


Das One2many‑Feld ist ein grundlegendes Element des Odoo‑Datenmodells. Es bildet viele zentrale Funktionen ab — von Bestellpositionen über Rechnungszeilen bis hin zu Projektaufgaben. Sobald das Zusammenspiel mit dem Many2one auf der Kindseite klar ist, lässt sich Odoos Struktur viel leichter verstehen und erweitern.


Egal, ob Sie Odoo konfigurieren, mit Studio anpassen oder eigene Module schreiben: das One2many ist ein Werkzeug, das Sie regelmäßig brauchen werden. Wer weiß, wann es sinnvoll ist, wie es korrekt definiert wird und welche Fallstricke es gibt, spart Zeit und vermeidet Datenprobleme.

Wenn Sie weitere Tutorials zu Odoo‑Feldern und zur API suchen, stöbern Sie in der Sammlung "Odoo Daten & API" nach passenden Artikeln und Anleitungen.

Brauchen Sie Unterstützung bei Ihrer Odoo-Einführung?


Dasolo unterstützt Unternehmen dabei, Odoo zu implementieren, anzupassen und so zu optimieren, dass es zur jeweiligen Geschäftslogik passt. Ob Datenmodellierung, individuelle Module, Feld‑Anpassungen oder Verbesserungen bestehender Prozesse — unser Team hilft gern.

Haben Sie Fragen zu Ihrem Odoo‑Projekt oder möchten Sie über die beste Strukturierung Ihrer Daten sprechen, kontaktieren Sie unsund wir beraten Sie gerne.

One2many-Feld in Odoo: Der komplette Leitfaden
Dasolo 6. März 2026
Diesen Beitrag teilen
Anmelden , um einen Kommentar zu hinterlassen