Overslaan naar inhoud

Many2One Veld in Odoo: De Ultieme Gids

Een praktische gids voor het Many2One-veld in het Odoo-datamodel, van basisgebruik tot relationele logica en technische aanpassing
6 maart 2026 in
Many2One Veld in Odoo: De Ultieme Gids
Dasolo
| Nog geen reacties

Inleiding


Het Many2One-veld is een van de fundamentele bouwstenen van het Odoo-datamodel. Elke keer dat je een verkooporder aan een klant koppelt, een product aan een categorie toewijst of een taak aan een project verbindt, werk je met een Many2One-relatie. Het is het meest voorkomende relationele veldtype in Odoo, en begrijpen hoe het werkt is essentieel voor iedereen die serieuze Odoo-ontwikkeling of -aanpassing doet.


Vanuit zakelijk perspectief zijn Many2One-velden wat Odoo zijn samenhang geeft als een geïntegreerd systeem. Zonder hen zou elke module een eiland zijn. Met hen stroomt data natuurlijk van het ene record naar het andere, en kunnen gebruikers tussen gerelateerde documenten navigeren zonder ooit na te denken over de database-structuur.


Deze gids behandelt wat het Many2One-veld opslaat, hoe het zich gedraagt in de Odoo ORM en in de interface, hoe je het kunt maken en configureren met Odoo Studio of Python, en echte zakelijke gebruikscases uit CRM, Verkoop, Voorraad en Boekhouding.

Wat is het Many2One-veld in Odoo


In de Odoo ORM creëert een Many2One-veld een link van één record naar precies één record in een ander model. De naam beschrijft de relatie vanuit het perspectief van het huidige model: veel records hier kunnen naar één record daar wijzen. Bijvoorbeeld, veel verkooporders kunnen naar één klant wijzen, en veel producten kunnen tot één productcategorie behoren.


Op het niveau van de database slaat een Many2One-veld een vreemde sleutel op in de huidige tabel. Als een verkooporder is gekoppeld aan klant-ID 42, bevat de partner_id kolom op de sale_order tabel het geheel 42. Odoo behandelt automatisch de join en het ophalen van de naam van het gerelateerde record.


In de gebruikersinterface verschijnt een Many2One-veld als een dropdown of typeahead invoer. Gebruikers kunnen beginnen met het typen van een naam, en Odoo filtert in realtime overeenkomende records. Het selecteren van een record stelt de link in. Het veld toont de naam van het gekoppelde record, niet de interne ID. Dit maakt het een van de meest natuurlijke veldtypes vanuit het perspectief van de gebruikerservaring.

Hier is hoe het eruit ziet in een Python-modeldefinitie:


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',
    )

De comodel_name parameter is de technische naam van het model waar je naar linkt. De ondelete parameter bepaalt wat er met het huidige record gebeurt als het gekoppelde record wordt verwijderd. De drie opties zijn cascade (verwijder ook het huidige record), set null (maak de link leeg), en restrict (blokkeer verwijdering als er een record naar verwijst).


In Odoo Studio verschijnt het Many2One-veld onder het label Many2One in de veldkiezer. Wanneer je er een toevoegt via Studio, kies je het doelformulier uit een lijst, en Studio verzorgt de veldcreatie. Dit maakt het een van de meest toegankelijke Odoo-studio-velden voor het opzetten van relaties zonder code te schrijven.

Hoe het veld werkt


Wanneer je een Many2One-veld leest via de Odoo ORM, krijg je een recordset met het gekoppelde record. Als het veld leeg is, krijg je een lege recordset. In Python kun je het gerelateerde record direct benaderen en naar zijn velden navigeren met behulp van puntnotatie:


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

Deze keten-navigatie is een van de meest handige aspecten van het Odoo-framework. Je hoeft geen expliciete joins of aparte queries te schrijven. De ORM verzorgt het databasewerk op de achtergrond.

Bij het lezen via de XML-RPC API retourneert een Many2One-veld een lijst met twee elementen: de gehele ID van het gekoppelde record en de weergavenaam. Bijvoorbeeld, [42, "Acme Corp"]. Als het veld leeg is, retourneert het False. Dit is belangrijk om te weten bij het verwerken van API-responses in je scripts.


Belangrijke Veldattributen

Dit zijn de belangrijkste eigenschappen die je kunt configureren op een Many2One-veld in het Odoo-framework:

  • comodel_name: De technische naam van het doellmodel. Dit is de enige vereiste parameter.
  • ondelete: Wat er gebeurt met het huidige record wanneer het gekoppelde record wordt verwijderd. Opties zijn 'cascade', 'set null', en 'restrict'. Standaard is 'set null'.
  • domain: Een filter dat beperkt welke records de gebruiker kan selecteren in de dropdown. Bijvoorbeeld, domain=[('customer_rank', '>', 0)] beperkt de partnerselectie tot klanten alleen.
  • context: Extra contextwaarden die worden doorgegeven bij het openen van het gerelateerde record of de dropdown. Handig voor het vooraf invullen van velden op nieuw aangemaakte gerelateerde records.
  • required: Maakt het veld verplicht. Het record kan niet worden opgeslagen tenzij dit veld is ingevuld.
  • readonly: Voorkomt dat gebruikers het gekoppelde record wijzigen. Handig wanneer de link programmatisch is ingesteld en niet handmatig mag worden gewijzigd.
  • delegate: Wanneer ingesteld op True, worden alle velden van het gerelateerde model direct toegankelijk op het huidige model. Dit wordt gebruikt voor modelovererving in Odoo-ontwikkeling, niet voor reguliere relationele velden.

Hoe het verschijnt in weergaven

In formulierweergaven wordt een Many2One-veld weergegeven als een dropdown met een zoekinvoer. Gebruikers kunnen een gedeeltelijke naam typen om de lijst te filteren. Ze kunnen ook op het pijlicoon naast het veld klikken om het gekoppelde record direct te openen, wat zeer nuttig is voor het navigeren tussen gerelateerde documenten zonder door menu's te gaan.


In lijstweergaven tonen Many2One-velden de naam van het gekoppelde record. Ze ondersteunen group-by-operaties: je kunt een lijst van verkooporders groeperen op klant, of een lijst van taken op project. Deze groepering is een van de meest gebruikte functies in Odoo-rapportage.


In zoekweergaven kunnen Many2One-velden worden gebruikt als filters en group-by-criteria. Wanneer je zoekt op klant in de CRM-pijplijn, filter je op een Many2One-veld.


De wederkerige One2Many

Elke Many2One-relatie heeft een natuurlijke omgekeerde relatie: de One2Many. Als verkooporders via Many2One aan een klant zijn gekoppeld, kan het klantrecord een lijst van alle gekoppelde verkooporders blootleggen via een One2Many-veld. In Odoo-ontwikkeling is het een goede praktijk om beide zijden van de relatie te creëren. Dit stelt gebruikers in staat om van het klantformulier naar al hun orders te navigeren zonder een aparte zoekopdracht uit te voeren. Het One2Many-veld voegt geen databasekolom toe; het wordt berekend vanuit de Many2One-buitenlandse sleutel aan de andere kant.

Zakelijke gebruikscases


Het Many2One-veld is overal in een standaard Odoo-implementatie. Hier zijn vijf praktische voorbeelden uit echte bedrijfsworkflows.


CRM: Leads koppelen aan verkopers

In de Odoo CRM-module heeft elke lead of kans een user_id veld, dat een Many2One is dat naar res.users wijst. Dit is de verkoper die verantwoordelijk is voor de lead. Managers kunnen de pijplijn filteren op verkoper, conversieratio's per vertegenwoordiger bekijken en leads in bulk toewijzen. Het Many2One-veld maakt dit soort segmentatie en rapportage mogelijk zonder aangepaste ontwikkeling. Als je een tweede verkoper of een speciaal accountmanager-veld wilt toevoegen, voeg je eenvoudig een ander Many2One-veld toe dat naar hetzelfde model wijst.


Verkoop: Verbinden van orders met klanten en prijslijsten

Een verkooporder in Odoo heeft minstens twee belangrijke Many2One-velden: partner_id (de klant, gekoppeld aan res.partner) en pricelist_id (de prijslijst, gekoppeld aan product.pricelist). Wanneer een verkoper een klant selecteert, kan Odoo automatisch de prijslijst, betalingsvoorwaarden en afleveradres invullen op basis van het klantrecord. Deze automatische invulling wordt aangestuurd door onchange-methoden die de Many2One-waarde lezen en gerelateerde velden invullen. Het is een van de meest zichtbare voordelen van een goed gestructureerd Odoo-datamodel.


Voorraad: Producten en Categorieën

Elk product in Odoo behoort tot een productcategorie via een Many2One-veld (categ_id op product.template). De productcategorie beheert de boekhoudrekeningen voor de kosten van verkochte goederen en inkomsten, waarderingsmethoden en verwijderstrategieën in magazijnen. Het is cruciaal om de categorietoewijzing op elk product correct te krijgen voor een juiste financiële rapportage. Een Many2One-veld maakt deze toewijzing eenvoudig: één dropdown per product, één categorrecord gedeeld over honderden producten.


Boekhouding: Journaalposten en Journals

Elke journaalpost in Odoo is gekoppeld aan een boekhoudjournaal via een Many2One-veld (journal_id op account.move). Het journaal bepaalt de volgorde die wordt gebruikt voor documentnummering, het type invoer (verkoop, aankoop, bank, contant, divers) en in sommige gevallen de standaard debet- en creditrekeningen. Het selecteren van het verkeerde journaal op een leveranciersfactuur of een betaling creëert invoeren in het verkeerde gedeelte van de grootboek. Het Many2One-veld hier is niet alleen een gemak; het is een controlepunt voor boekhoudkundige nauwkeurigheid.


Projectmanagement: Taken en Projecten

In de Odoo Project-module behoort elke taak tot een project via een Many2One-veld (project_id op project.task). Deze enkele link bepaalt welke fasevoortgang de taak volgt, welke teamleden er toegang toe hebben en hoe urenstaten worden toegewezen. Voor professionele dienstverlenende bedrijven die per project factureren, is de Many2One-link tussen urenstaten, taken en het bovenliggende project de ruggengraat van de omzetherkenning en factureringsworkflows.

Een Many2One-veld maken of aanpassen


Er zijn drie hoofdmanieren om een Many2One-veld toe te voegen aan een Odoo-model, afhankelijk van je technische context en implementatieaanpak.


Odoo Studio gebruiken (Geen code)

Odoo Studio is de ingebouwde low-code aanpassings-tool. Om een Many2One-veld toe te voegen zonder enige code te schrijven:

  1. Open Odoo Studio vanuit het hoofdmenu.
  2. Navigeer naar het formulier waar je het veld wilt.
  3. Sleep een Many2One-veld vanuit de veldkiezer naar het formulier.
  4. Kies in het eigenschappenpaneel het doormodel uit de lijst.
  5. Stel het label in en eventuele optionele domeinfilter om te beperken welke records gebruikers kunnen selecteren.
  6. Sla op en sluit Studio.

Studio maakt het veld met een x_studio_ voorvoegsel en voegt het automatisch toe aan de formulierweergave. Het veld is onmiddellijk functioneel: gebruikers kunnen de dropdown openen, zoeken naar gekoppelde records en er een selecteren. Dit is een van de snelste manieren om een formulier uit te breiden met een relationele link, en het vereist geen technische kennis behalve het begrijpen van wat de twee modellen in jouw bedrijf vertegenwoordigen.


Python gebruiken in een aangepaste module

Voor ontwikkelaars die Odoo-modules bouwen, worden Many2One-velden rechtstreeks in Python gedefinieerd. Dit is de aanbevolen aanpak voor elke Odoo-ontwikkeling die versiebeheer nodig heeft en over meerdere omgevingen moet worden uitgerold:


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='De belangrijkste contactpersoon bij de klant voor deze taak.',
    )

Na het definiëren van het veld in het model, voeg het toe aan de relevante view XML en voer een upgrade uit om de databasewijzigingen toe te passen. Deze aanpak geeft volledige controle over domeinfilters, ondelete-gedrag en integratie met compute-methoden en beperkingen. Het is de standaard Odoo ontwikkelaarsgids aanpak voor relationele velden in productiemodules.


Bij het creëren van een Many2One als onderdeel van Odoo-aanpassingen, is het ook een goede praktijk om het bijbehorende One2Many-veld op het gerelateerde model toe te voegen, zodat gebruikers in beide richtingen van de relatie kunnen navigeren:


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

    x_task_ids = fields.One2Many(
        comodel_name='project.task',
        inverse_name='x_client_contact_id',
        string='Gerelateerde Taken',
    )

Gebruik de XML-RPC API

Als je Odoo-aanpassingen programmatically beheert, bijvoorbeeld via een implementatiescript of een remote configuratienotitieboek, kun je Many2One-velden maken via de XML-RPC API:


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

De relation sleutel specificeert het doormodel. De on_delete sleutel stelt het verwijdergedrag in. Bij het creëren via de API, vergeet niet ook het wederkerige One2Many-veld op het gerelateerde model te creëren, zodat navigatie van beide kanten van de relatie werkt. Dit is een van de verplichte regels in Dasolo remote configuraties voor elke Many2One-veldcreatie.

Beste praktijken


1. Maak altijd het wederkerige One2Many

Wanneer je een Many2One-veld aan een model toevoegt, maak dan ook het bijbehorende One2Many op het gerelateerde model aan. Dit kost je geen extra databasekolom, maar maakt navigatie veel natuurlijker voor gebruikers. Zonder dit hebben gebruikers geen manier om vanuit het klantformulier te zien welke taken, bestellingen of aangepaste records aan hen zijn gekoppeld.


2. Gebruik domeinfilters om selectie te beperken

Een Many2One-veld dat naar res.partner wijst, geeft standaard toegang tot alle partners, inclusief leveranciers, klanten, interne gebruikers en afleveradressen. Als je bedrijfslogica alleen zinvol is voor klanten, voeg dan een domeinfilter toe zoals domain=[('customer_rank', '>', 0)]. Dit vermindert ruis in de dropdown en voorkomt dat gebruikers onjuiste selecties maken die geldig lijken, maar verkeerde resultaten opleveren downstream.


3. Kies ondelete zorgvuldig

Het ondelete gedrag is belangrijker dan het lijkt. Het gebruik van 'cascade' betekent dat het verwijderen van het gekoppelde record ook alle records die ernaar verwijzen, zal verwijderen. Dit kan onbedoelde massaverwijderingen veroorzaken. In de meeste zakelijke scenario's is 'set null' de veiligste keuze: het wist de link zonder iets te verwijderen. Gebruik 'restrict' wanneer het gekoppelde record nooit mag worden verwijderd zolang er iets naar verwijst, bijvoorbeeld een productcategorie die producten heeft toegewezen.


4. Vermijd het dupliceren van gegevens die een Many2One zouden moeten zijn

Een veelgemaakte fout in vroege Odoo-aanpassingsprojecten is het toevoegen van een char-veld om een bedrijfsnaam of een categorielabel op te slaan, terwijl een Many2One die naar een bestaand model verwijst de juiste aanpak zou zijn. Char-velden voor waarden die al als records in een ander model bestaan, creëren gegevensduplicatie, maken filteren en groeperen onbetrouwbaar en veroorzaken inconsistenties wanneer namen veranderen. Als de gegevens die je nodig hebt in een ander model staan, gebruik dan een Many2One.


5. Gebruik context om gerelateerde records vooraf in te vullen

De context eigenschap op een Many2One-veld stelt je in staat om standaardwaarden door te geven wanneer gebruikers een nieuw gekoppeld record direct vanuit de dropdown aanmaken. Als een Many2One bijvoorbeeld naar een contact binnen een project verwijst, kun je het project op het nieuwe contactrecord vooraf invullen met behulp van context. Dit vermindert handmatige invoer en helpt de gegevensconsistentie te behouden wanneer gebruikers gerelateerde records on-the-fly aanmaken.

Veelvoorkomende valkuilen


Vergeten van de wederkerige One2Many

Het toevoegen van een Many2One-veld zonder het creëren van de inverse One2Many op het gerelateerde model is de meest voorkomende vergissing in Odoo-aanpassingen. Het resultaat is een eendirectionele link: je kunt het gekoppelde record vanuit het huidige model zien, maar vanuit het gekoppelde record heb je geen manier om alle records te vinden die ernaar verwijzen. Gebruikers beginnen te klagen dat ze gerelateerde records niet kunnen vinden, en iemand eindigt met het bouwen van een aangepaste zoekopdracht of rapport om te compenseren voor een ontbrekend invers veld.


Cascade-verwijdering gebruiken zonder er goed over na te denken

Het instellen van ondelete='cascade' op een Many2One die operationele records aan een masterrecord koppelt, kan ernstige gegevensverlies veroorzaken. Als een gebruiker een productcategorie archiveert of verwijdert, en alle producten die eraan gekoppeld zijn cascade-verwijdering hebben, verdwijnt elk product in die categorie. In de meeste gevallen is set null of restrict het juiste gedrag voor zakelijke gegevens.


Niet controleren op False bij navigeren in Python

Wanneer een Many2One-veld leeg is, retourneert het lezen ervan een lege recordset in Python, wat falsy is. Als je code order.partner_id.name uitvoert zonder te controleren of partner_id is ingesteld, retourneert het een lege string in plaats van een fout te genereren. Dat is vaak acceptabel, maar als je meerdere niveaus diep navigeert (order.partner_id.country_id.name) en elke link in de keten leeg is, krijg je aan het einde een lege string, wat stilletjes verkeerde uitvoer in rapporten of e-mails kan produceren. Controleer altijd op lege recordsets wanneer het veld niet vereist is.


Wijzen naar het verkeerde model

In Odoo wordt res.partner gebruikt voor klanten, leveranciers, contacten en bedrijven tegelijk. Een Many2One die naar res.partner wijst zonder een domeinfilter geeft toegang tot al deze entiteiten. Als je het veld alleen voor klanten bedoelde maar het domein vergat, zullen verkopers interne gebruikers, leveradressen en leverancierscontacten in de dropdown zien. Definieer altijd een domeinfilter dat overeenkomt met de werkelijke zakelijke intentie van het veld.


Overmatig gebruik van Many2One waar een Selectievakje voldoende zou zijn

Als de gekoppelde waarden een vaste, kleine lijst zijn die nooit verandert, is een Selectievakje vaak eenvoudiger en efficiënter dan een Many2One. Many2One-velden vereisen een apart model met records en voegen een databasejoin toe aan elke query. Voor iets als een status met drie of vier opties is een Selectievakje netter. Gebruik Many2One wanneer de set mogelijke waarden groot is, door gebruikers wordt beheerd of over meerdere modellen wordt gedeeld.

Conclusie


Het Many2One-veld is de kern van hoe Odoo gegevens tussen modules verbindt. Het begrijpen ervan is niet alleen een zorg voor ontwikkelaars. Bedrijfsanalisten, functionele consultants en power users die Odoo met Studio willen uitbreiden, profiteren allemaal van het weten wat een Many2One doet, wanneer je er een moet gebruiken en waar je op moet letten.


De belangrijkste punten om te onthouden: maak altijd de wederzijdse One2Many aan zodat navigatie van beide kanten werkt, gebruik domeinfilters om dropdowns schoon en relevant te houden, kies je ondelete-gedrag opzettelijk en vermijd het gebruik van Many2One waar een eenvoudiger Selectievakje de klus zou klaren.


Of je nu een veld configureert via Odoo Studio, een aangepaste Python-module schrijft of je Odoo-datamodel beheert via de XML-RPC API, het correct instellen van relationele velden vanaf het begin maakt je implementatie betrouwbaarder en veel gemakkelijker te onderhouden in de loop van de tijd.

Bij Dasolo helpen we bedrijven Odoo te implementeren, aan te passen en te optimaliseren in alle afdelingen. Of je nu hulp nodig hebt bij het ontwerpen van een schoon datamodel, het toevoegen van relationele velden aan je formulieren, of het bouwen van een volledige Odoo-module vanaf nul, ons team staat voor je klaar om je te ondersteunen. Neem contact met ons op en laten we praten over jouw Odoo-project.

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