Overslaan naar inhoud

One2many Veld in Odoo: De Complete Gids

Hoe het One2many-veld werkt in Odoo, wanneer je het moet gebruiken en hoe je het in je datamodel implementeert
6 maart 2026 in
One2many Veld in Odoo: De Complete Gids
Dasolo
| Nog geen reacties

Inleiding


Als u ooit een verkooporder in Odoo hebt geopend en de lijst met orderregels onder de klantgegevens hebt opgemerkt, heeft u het One2many-veld al in actie gezien. Het is een van de belangrijkste bouwstenen in het Odoo-datamodel, en begrijpen hoe het werkt is essentieel voor iedereen die betrokken is bij Odoo-ontwikkeling of -aanpassing.


Deze gids legt uit wat het One2many-veld is, hoe het werkt in de Odoo ORM, wanneer u het in uw eigen opzet moet gebruiken en hoe u het kunt maken of configureren, hetzij via Odoo Studio of rechtstreeks in Python-code.

Of u nu een zakelijke gebruiker bent die probeert te begrijpen hoe uw gegevens zijn gestructureerd, of een ontwikkelaar die op zoek is naar een praktische Odoo-veldhandleiding, dit artikel behandelt wat u moet weten.

Wat is het One2many-veld in Odoo


Het One2many-veld is een relationeel veldtype in het Odoo-framework. Het stelt een enkele ouderrecord in staat om te worden gekoppeld aan meerdere kindrecords uit een ander model.


Denk er zo over na: één Klant kan veel Facturen hebben. Eén Verkooporder kan veel Orderregels bevatten. Eén Project kan veel Taken bevatten. Het ouderrecord houdt een verwijzing naar alle gerelateerde kindrecords via het One2many-veld.


In de Odoo-interface verschijnt een One2many-veld doorgaans als een ingesloten lijst direct binnen een formulierweergave. Deze inline-tabel stelt gebruikers in staat om kindrecords toe te voegen, te bewerken of te verwijderen zonder ooit het ouderformulier te verlaten. Het is een van de meest zichtbare en vaak gebruikte patronen in de Odoo-gebruikersinterface.


Hoe het verschilt van andere relationele velden

Odoo heeft drie hoofd relationele veldtypes in zijn ORM:


  • Many2one: Een enkel record dat naar één record in een ander model wijst (bijvoorbeeld, een Verkooporder die naar één Klant wijst).
  • One2many: Een enkel record dat is gekoppeld aan meerdere records in een ander model (bijvoorbeeld een Verkooporder gekoppeld aan vele Orderregels).
  • Many2many: Meerdere records aan beide zijden die aan elkaar zijn gekoppeld (bijvoorbeeld een Product gekoppeld aan meerdere Tags, en elke Tag gekoppeld aan meerdere Producten).

De One2many wordt specifiek gebruikt wanneer een kindrecord tot één en slechts één ouder behoort. Als een kindrecord moet worden gedeeld tussen meerdere ouders, is Many2many de juiste keuze.


Onder de motorkap is het One2many-veld uniek onder de Odoo-veldtypes omdat het zelf geen gegevens opslaat. Het is een virtueel veld dat gegevens leest van het kindmodel met behulp van een Many2one-veld op dat kind als ankerpunt.

Hoe het veld werkt


Het One2many-veld slaat onder de motorkap niets op in de database tabel van het oudermodel. In plaats daarvan vertrouwt het op een Many2one-veld dat bestaat op het kindmodel en terugwijst naar de ouder.


Dit is een kernprincipe in de Odoo ORM: elk One2many-veld heeft een overeenkomstig Many2one-veld op het gerelateerde model. De One2many is in wezen een omgekeerde opzoeking. Odoo vindt alle kindrecords waar het Many2one-veld gelijk is aan de ID van het huidige ouderrecord.


De Relatie Tussen One2many en Many2one

Wanneer je een One2many-veld in Python definieert, geef je twee belangrijke parameters op:


  • comodel_name: het model dat de kindrecords bevat.
  • inverse_name: de naam van het Many2one-veld op het kindmodel dat terugwijst naar de ouder.

Hier is een eenvoudig voorbeeld uit een aangepaste Odoo-module, die laat zien hoe een Servicecontract aan meerdere Leverbare records is gekoppeld:


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

In dit voorbeeld is contract_id een Many2one-veld op het service.deliverable model dat terugwijst naar het contract. Zonder dat Many2one-veld dat eerst bestaat, kan de One2many niet functioneren.


Wat Gebeurt Er in de Database

In de Odoo-database wordt er niets opgeslagen in de oudertabel voor een One2many-veld. De gegevens bevinden zich in de tabel van het kindmodel, waar elke kindrij een kolom met een vreemde sleutel heeft die naar de ID van het ouderrecord wijst.

Wanneer Odoo een ouderrecord laadt en het One2many-veld moet weergeven, voert het een SQL-query uit die gelijkwaardig is aan: vind alle rijen in de kindtabel waar de vreemde sleutel overeenkomt met de huidige ouder-ID. Dit is standaardgedrag voor relationele databases, en de Odoo ORM handelt dit automatisch af.


Dit ontwerp is ook de reden waarom het One2many-veld wordt beschouwd als onderdeel van de Odoo python-velden die geen kolommen aan de database toevoegen. Het is puur een berekende weergave van gerelateerde records.

Zakelijke gebruiksscenario's


One2many-velden komen overal in Odoo voor omdat ze de echte wereld ouder-kindrelaties op een natuurlijke manier modelleren. Hier zijn vijf praktische voorbeelden uit veelvoorkomende bedrijfsworkflows.


1. Verkooporders en Orderregels

De Verkoopmodule gebruikt een One2many-veld genaamd order_line_ids op het sale.order model om te linken naar sale.order.line. Elke regel slaat een product, hoeveelheid, eenheidsprijs en korting op. Gebruikers kunnen regels toevoegen of verwijderen rechtstreeks vanuit het Verkooporderformulier zonder weg te navigeren.


2. Facturen en Factuurregels

In de Boekhoudmodule gebruikt het account.move model een One2many-veld om factuurregels te beheren (account.move.line). Elke regel vertegenwoordigt een product of dienst die aan de klant in rekening wordt gebracht. De bovenliggende factuur aggregeert de totalen van al zijn kindregels.


3. Projecten en Taken

De Projectmodule gebruikt een One2many-veld op project.project om alle taken die aan dat project toebehoren weer te geven. In de formulierweergave kan dit verschijnen als een lijst, een kanban-bord of een Gantt-diagram, allemaal aangedreven door dezelfde onderliggende One2many-relatie.


4. Contacten en Sub-contacten

Het res.partner model heeft een child_ids One2many-veld dat alle individuele contacten opsomt die aan een bedrijf zijn gekoppeld. Wanneer je een bedrijfsrecord opent, toont het tabblad Contacten alle werknemers of contactpersonen. Elk van die sub-contacten heeft een Many2one-veld (parent_id) dat terugwijst naar het bedrijf.


5. Aangepaste Modellen in Dienstverlening of Productie

Bij het bouwen van een aangepaste Odoo-module is het One2many-veld de natuurlijke keuze voor elk scenario waarin één record een lijst van sub-records bezit. Voorbeelden zijn: een onderhoudsverzoek gekoppeld aan meerdere gebruikte reserveonderdelen, een training gekoppeld aan meerdere sessiedatums, of een servicecontract gekoppeld aan een lijst van leveringen.


Deze flexibiliteit is een van de redenen waarom het One2many-veld zo centraal staat in Odoo-aanpassingen en in het bouwen van op maat gemaakte datamodellen voor verschillende sectoren.

Het veld maken of aanpassen


Er zijn twee hoofdmanieren om een One2many-veld in Odoo toe te voegen: met Odoo Studio voor een no-code benadering, of door Python-code rechtstreeks in een aangepaste module te schrijven.


Odoo Studio gebruiken

Odoo Studio laat je geen One2many-veld rechtstreeks maken vanuit de veldkiezer op het bovenliggende model. Dit komt omdat de One2many altijd vereist dat er eerst een Many2one op het kindmodel bestaat.

Het aanbevolen proces in Studio is:

  1. Open het kindmodel in Studio en voeg een Many2one-veld toe dat naar het bovenliggende model wijst.
  2. Zodra de Many2one is opgeslagen, ga je terug naar het bovenliggende model in Studio.
  3. Voeg een nieuw veld toe en kies het type "One2many". Studio vraagt je om het gerelateerde model en het inverse Many2one-veld te selecteren.
  4. Het One2many-veld zal vervolgens verschijnen als een ingesloten lijst in je formulierweergave.

Voor veel zakelijke gebruikers is dit de eenvoudigste manier om One2many-relaties te creëren zonder enige code te schrijven. Odoo Studio-velden die op deze manier zijn gemaakt, gedragen zich precies zoals hun Python-equivalenten.


Python-code gebruiken in een aangepaste module

Voor ontwikkelaars die werken aan Odoo-ontwikkelingsprojecten, biedt het definiëren van One2many-velden in Python volledige controle over gedrag, naamgeving en domeinfilters. Hier is een compleet voorbeeld:


from odoo import fields, models

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

    name = fields.Char(string='Contractnaam', required=True)
    deliverable_ids = fields.One2many(
        comodel_name='service.deliverable',
        inverse_name='contract_id',
        string='Leveringen'
    )


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

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

Let op dat het Many2one-veld (contract_id) eerst op het kindmodel is gedefinieerd. De inverse_name in de One2many-definitie moet exact overeenkomen met de naam van het Many2one-veld.


Het aanmaken van het veld via de XML-RPC API

Als je Odoo-databasevelden programmatisch beheert, kun je ook One2many-velden aanmaken via de XML-RPC API met behulp van het ir.model.fields model. Het proces volgt dezelfde regel: maak eerst de Many2one aan, en definieer vervolgens de One2many met de relation_field parameter die naar de naam van het Many2one-veld verwijst.


Deze aanpak is bijzonder nuttig bij het beheren van Odoo-databasevelden in meerdere omgevingen of bij het automatiseren van Odoo-aanpassingsworkflows.

Beste praktijken


Gebaseerd op ervaring met het implementeren van Odoo voor klanten in verschillende sectoren, zijn hier de belangrijkste praktijken die een verschil maken bij het werken met One2many-velden.


  • Maak altijd eerst de Many2one aan. De One2many kan niet bestaan zonder zijn inverse veld. Of je nu Studio, Python-code of de API gebruikt, de Many2one op het kindmodel moet bestaan voordat je de One2many op de ouder definieert.
  • Gebruik de _ids suffix voor veldnamen. Volgens de conventie in Odoo worden One2many-velden genoemd met de _ids suffix, bijvoorbeeld line_ids, task_ids, deliverable_ids. Dit maakt het onmiddellijk duidelijk in de code dat het veld een recordset retourneert.
  • Stel ondelete='cascade' in wanneer dat gepast is. Als kindrecords automatisch moeten worden verwijderd wanneer de ouder wordt verwijderd, stel dan deze optie in op het Many2one-veld. Dit voorkomt dat er weesrecords in je database accumuleren.
  • Houd de ingesloten lijst gefocust. Toon alleen de meest relevante kolommen in de One2many-lijstweergave. Te veel kolommen tonen maakt het formulier traag en moeilijk leesbaar. Gebruik de optional eigenschap voor secundaire kolommen die gebruikers kunnen in- of uitschakelen.
  • Gebruik domeinfilters om zichtbare kindrecords te beperken. Je kunt een domain parameter toevoegen aan een One2many-velddefinitie om te beperken welke kindrecords worden weergegeven op basis van specifieke voorwaarden. Dit is nuttig wanneer een kindmodel wordt gedeeld tussen verschillende oudermodellen.
  • Ga voorzichtig om met grote datasets. Als een ouderrecord duizenden kindrecords kan hebben, vermijd dan om ze allemaal tegelijk in de formulierweergave te laden. Overweeg om een aparte lijstweergave te gebruiken of paginering toe te voegen aan de ingesloten tabel.

Veelvoorkomende valkuilen


Hier zijn de meest voorkomende fouten die zich voordoen bij het werken met One2many-velden in Odoo, zowel in ontwikkeling als in configuratie.


Vergeten van de Many2one Inverse

De meest voorkomende fout bij het aanmaken van velden in Odoo is het definiëren van een One2many zonder eerst het bijbehorende Many2one op het kindmodel te creëren. Odoo zal een foutmelding geven omdat het inverse veld niet bestaat. Controleer altijd of de inverse_name die je opgeeft daadwerkelijk bestaat op het kindmodel.


Het Gebruik van de Verkeerde Schrijfsyntaxis

Bij het bijwerken van een One2many-veld via Python-code of de API, moet je de Odoo-opdracht tuples syntaxis gebruiken. Je kunt geen gewone Python-lijst toewijzen aan een One2many-veld. De juiste manier om schrijfopdrachten te gebruiken ziet er als volgt uit:


  • (0, 0, values_dict) om een nieuw kindrecord te creëren.
  • (1, child_id, values_dict) om een bestaand kindrecord bij te werken.
  • (2, child_id, 0) om een bestaand kindrecord te verwijderen.
  • (4, child_id, 0) om een bestaand kindrecord aan de relatie toe te voegen.
  • (5, 0, 0) om alle kindrecords van de ouder te ontkoppelen (zonder ze te verwijderen).

Proberen een gewone lijst zoals record.line_ids = [1, 2, 3] te schrijven zal niet werken zoals verwacht in de Odoo ORM.


One2many verwarren met Many2many

Een One2many betekent dat elk kindrecord precies tot één ouder behoort. Als je merkt dat je een kindrecord aan meerdere ouders tegelijkertijd wilt koppelen, is de juiste keuze een Many2many-veld, geen One2many. Het gebruik van One2many in dat scenario zou je dwingen om records te dupliceren, wat problemen met de gegevensintegriteit creëert.


Prestatieproblemen met Grote Sub-lijsten

Als een One2many-veld honderden of duizenden regels in een formulierweergave weergeeft, zal de laadtijd van de pagina aanzienlijk vertragen. Dit is een veelvoorkomend probleem in Boekhouding (factuurregels) en Voorraad (voorraadbewegingregels). Gebruik de limit eigenschap in de lijstweergave of leid gebruikers om naar een aparte lijstweergave voor grote datasets.


Wees voorzichtig met weesrecords na verwijdering

Als je een ouderrecord verwijdert zonder ondelete='cascade' in te stellen op het Many2one-veld van het kind, kunnen kindrecords in de database blijven met een null- of ongeldig ouderreferentie. Na verloop van tijd kan dit je database vervuilen en onverwacht gedrag in weergaven en rapporten veroorzaken. Definieer altijd een duidelijk verwijderingsbeleid bij het ontwerpen van je datamodel.

Conclusie


Het One2many-veld is een fundamenteel onderdeel van de Odoo ORM en het Odoo-datamodel. Het ondersteunt enkele van de meest essentiële functies op het platform, van verkooporderregels tot factuurregels tot projecttaken. Zodra je begrijpt hoe het werkt en hoe het zich verhoudt tot het Many2one-veld op het kindmodel, wordt een groot deel van de interne structuur van Odoo veel gemakkelijker te lezen en uit te breiden.


Of je nu Odoo configureert voor je bedrijf, het aanpast via Studio, of een aangepaste module vanaf nul bouwt, het One2many-veld zal een hulpmiddel zijn dat je regelmatig zult gebruiken. Weten wanneer je het moet gebruiken, hoe je het correct moet definiëren en hoe je veelvoorkomende fouten kunt vermijden, zal je veel tijd besparen en gegevensproblemen in de toekomst voorkomen.

Als je op zoek bent naar meer Odoo-veld tutorials en technische gidsen, verken dan de andere artikelen in de Odoo Data & API-collectie.

Hulp nodig bij uw Odoo-implementatie?


Dasolo helpt bedrijven bij het implementeren, aanpassen en optimaliseren van Odoo om aan hun specifieke zakelijke behoeften te voldoen. Of je nu hulp nodig hebt bij het ontwerpen van je datamodel, het bouwen van aangepaste modules, het creëren van velden in Odoo, of gewoon meer waarde wilt halen uit je bestaande setup, ons team staat klaar om te helpen.

Als je vragen hebt over je Odoo-project of wilt bespreken hoe je je gegevens het beste kunt structureren, neem contact met ons op. We helpen je graag.

One2many Veld in Odoo: De Complete Gids
Dasolo 6 maart 2026
Deel deze post
Aanmelden om een reactie achter te laten