Overslaan naar inhoud

Many2One-veld in Odoo: De Complete Handleiding

Praktische handleiding voor het Many2One-veld in het Odoo-datamodel: van basisgebruik over relationele logica tot technische aanpassingen
6 maart 2026 in
Many2One-veld in Odoo: De Complete Handleiding
Dasolo
| Nog geen reacties

Introductie


Het Many2One-veld is een van de hoekstenen van het Odoo-datamodel. Telkens wanneer je een verkooporder koppelt aan een klant, een product toewijst aan een categorie of een taak linkt aan een project, gebruik je dit type relatie. Voor ontwikkelaars en power users is inzicht in dit veld onmisbaar om betrouwbare en onderhoudbare oplossingen te bouwen.


Voor een bedrijf zorgt het Many2One-veld ervoor dat modules niet op zichzelf staan. Dankzij deze koppelingen stroomt informatie logisch van het ene document naar het andere en kunnen gebruikers eenvoudig tussen gerelateerde records navigeren zonder zich bezig te houden met technische databasedetails.


Deze handleiding legt uit wat een Many2One opslaat, hoe het zich gedraagt in de ORM en in de interface, hoe je het aanmaakt met Odoo Studio of in Python, en toont concrete voorbeelden uit CRM, verkoop, voorraadbeheer en boekhouding.

Wat is het Many2One-veld in Odoo


Binnen de Odoo ORM maakt een Many2One een verwijzing van één record naar precies één record in een ander model. De term benadrukt dat meerdere records in het huidige model kunnen wijzen naar hetzelfde doelrecord. Denk aan vele verkooporders die naar één klant verwijzen, of veel producten in één categorie.


Op database-niveau wordt de Many2One opgeslagen als een foreign key in de tabel van het huidige model. Staat een verkooporder naar klant-ID 42, dan bevat de kolom partner_id in de sale_order-tabel het getal 42. Odoo verzorgt automatisch het ophalen en tonen van de bijbehorende naam.


In de gebruikersinterface verschijnt een Many2One meestal als een dropdown met typeahead: je begint te typen en Odoo filtert rechtstreeks de overeenkomende records. Het gekozen item toont de naam van het gekoppelde record, niet het interne ID — dat maakt het veld intuïtief voor eindgebruikers.

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

Het comodel_name geeft technische verwijzing naar het doelmodel. Het ondelete-argument bepaalt wat er met het huidige record gebeurt als het doelrecord verwijderd wordt: cascade (meenemen), set null (link wissen) of restrict (verwijdering blokkeren).


In Odoo Studio vind je het Many2One-veld in de veldkiezer onder 'Many2One'. Studio laat je het doemodel kiezen en maakt het veld automatisch aan — ideaal voor snelle, codevrije relaties tussen modellen.

Hoe het veld werkt


Wanneer je een Many2One via de ORM leest, ontvang je een recordset met het gelinkte record; is het veld leeg, dan krijg je een lege recordset. In Python navigeer je eenvoudig naar gerelateerde velden met puntnotatie:


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

Deze kettingnavigatie is een kernvoordeel van Odoo: expliciete joins zijn meestal niet nodig — de ORM regelt de onderliggende databasequeries voor je.

Via de XML-RPC API retourneert een Many2One een lijst van twee elementen: het numerieke ID en de weergavenaam, bijvoorbeeld [42, "Acme Corp"]. Is het veld leeg, dan is het resultaat False. Houd hier rekening mee bij het verwerken van API-responses.


Belangrijke veld-attributen

Dit zijn de eigenschappen die je het vaakst instelt bij een Many2One-veld:

  • comodel_name: de technische naam van het doelmodel. Dit is het enige verplichte attribuut.
  • ondelete: bepaalt het gedrag bij verwijdering van het doelrecord: 'cascade', 'set null' of 'restrict'. Standaard is vaak 'set null'.
  • domain: een filter dat de selectie in de dropdown beperkt. Bijvoorbeeld domain=[('customer_rank', '>', 0)] zodat alleen klanten zichtbaar zijn.
  • context: extra contextwaarden die meegegeven worden bij het openen van het gerelateerde record — handig om velden voor te vullen bij het aanmaken.
  • required: maakt het veld verplicht; het record kan niet opgeslagen worden zonder waarde.
  • readonly: voorkomt dat gebruikers de koppeling handmatig wijzigen; bruikbaar als de koppeling via code wordt ingesteld.
  • delegate: zet velden van het gerelateerde model direct beschikbaar op het huidige model; wordt gebruikt voor model-erfenis, niet voor gewone relaties.

Uiterlijk in views

In formulierweergaven toont een Many2One zich als een zoekbare dropdown. Je kan ook via de pijltje-knop het gerelateerde record openen — handig om snel tussen documenten te springen zonder te zoeken in het menu.


In lijstweergaven toont het veld de naam van het gekoppelde record en je kunt op dat veld groeperen. Zo groepeer je verkooporders op klant of taken op project; een veelgebruikte functie voor rapportage in Odoo.


In zoekfilters worden Many2One-velden gebruikt om resultaten te beperken of te groeperen — denk aan filteren op klant in de CRM-pijplijn.


De omgekeerde One2Many

Elke Many2One heeft een natuurlijke tegenhanger: de One2Many. Als verkooporders naar een klant verwijzen via Many2One, kan die klant een One2Many tonen met alle bijbehorende orders. Het is goede gewoonte om beide kanten van de relatie te modelleren: dat verbetert navigatie en gebruiksgemak. Een One2Many maakt geen extra kolom aan; het is afgeleid van de foreign key aan de andere kant.

Praktische bedrijfsvoorbeelden


Vijf concrete voorbeelden uit de praktijk


CRM: leads koppelen aan verkopers

In CRM wijst een field zoals user_id naar res.users en geeft aan welke verkoper verantwoordelijk is voor een lead. Managers filteren en rapporteren per verantwoordelijke zonder extra ontwikkeling. Heb je meerdere rollen nodig? Voeg eenvoudig een extra Many2One toe naar hetzelfde model.


Verkoop: orders koppelen aan klanten en prijslijsten

Een verkooporder bevat typisch partner_id (klant) en pricelist_id (prijslijst). Zodra een klant gekozen is, vult Odoo vaak automatisch betaalvoorwaarden, afleveradres en prijslijst in via onchange-methodes die de Many2One uitlezen — een zichtbaar voordeel van een goed datamodel.


Voorraad: producten en productcategorieën

Elk product heeft een categ_id die naar een productcategorie wijst. Die categorie stuurt boekhoudrekeningen, waarderingsmethode en voorraadverwijderstrategie. Een correcte categorie-indeling per product is cruciaal voor juiste financiële rapportering; een Many2One maakt die toewijzing eenvoudig en centraal beheerbaar.


Boekhouding: journaalregels en journals

Een boekstuk ligt vast op een journal via journal_id. Dat journal bepaalt nummering, type (verkoop, aankoop, bank, kas, etc.) en soms standaardrekeningen. Een verkeerde keuze kan posten in het verkeerde grootboek veroorzaken — daarom is de Many2One hier een belangrijk controlepunt.


Projectmanagement: taken en projecten

In Project hoort elke taak bij één project via project_id. Die koppeling bepaalt workflow-stadia, toegang voor teamleden en hoe timesheets worden toegewezen. Voor dienstverleners die per project factureren is deze Many2One de ruggengraat van omzetherkenning en facturatieprocessen.

Een Many2One-veld maken of aanpassen


Drie manieren om een Many2One toe te voegen


Via Odoo Studio (geen code)

Odoo Studio is de laagdrempelige aanpassingstool. Zo voeg je snel een Many2One toe zonder code:

  1. Open Odoo Studio vanuit het menu.
  2. Ga naar het formulier waar je het veld wil toevoegen.
  3. Sleep een Many2One-veld uit de veldkiezer naar het formulier.
  4. Kies in de eigenschappen het doelmodel uit de lijst.
  5. Stel label en eventueel een domain in om de selectie te beperken.
  6. Sla op en sluit Studio.

Studio maakt het veld met een x_studio_-prefix aan en voegt het meteen toe aan de view. Gebruikers kunnen direct records selecteren — een snelle manier om relaties toe te voegen zonder ontwikkelwerk.


Via Python in een custom module

Voor ontwikkelaars definieer je Many2One-velden rechtstreeks in Python — de aanbevolen aanpak voor versiebeheer en inzet in meerdere omgevingen:


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

Na het definiëren voeg je het veld toe aan de view-XML en voer je een module-upgrade uit om de database wijzigingen door te voeren. Dit geeft volledige controle over domain, ondelete, compute-methoden en constraints — de standaardroute voor productiecode.


Zorg altijd voor de inverse One2Many


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

Via de XML-RPC API

Als je Odoo programmatish beheert, kun je velden ook via XML-RPC aanmaken — handig voor deployment scripts of centrale configuraties:


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

De relation-sleutel bepaalt het doelmodel en on_delete het verwijdergedrag. Bij API-creatie moet je ook denken aan de inverse One2Many zodat navigatie aan beide zijden werkt — een cruciale regel in gecontroleerde remote-configuraties.

Aanbevolen werkwijzen


1. Maak altijd de inverse One2Many aan

Zonder inverse One2Many ontstaat een eenrichtingsrelatie: vanuit het gerelateerde record kun je niet snel zien welke records naar het verwijzen. Daarom altijd beide kanten modelleren voor betere gebruikersnavigatie.


2. Gebruik domain-filters om selectie te beperken

Een Many2One naar res.partner toont standaard alle partners (leveranciers, klanten, interne contacten). Als je enkel klanten nodig hebt, gebruik een domain zoals [('customer_rank', '>', 0)] om ruis te vermijden en foute keuzes te voorkomen.


3. Kies ondelete met zorg

ondelete='cascade' kan leiden tot onbedoeld massaverlies wanneer masterrecords verwijderd worden. In veel scenario's is 'set null' veiliger omdat het de link alleen wist. Gebruik 'restrict' wanneer een doelrecord nooit mag verdwijnen zolang er afhankelijkheden bestaan.


4. Dupliceer geen data die in een Many2One thuishoort

Veelgemaakte fout: namen of labels als char-velden opslaan in plaats van te linken via Many2One. Dat leidt tot duplicatie, slechtere filtermogelijkheden en inconsistenties bij naamswijzigingen. Als de waarde al als record bestaat, link er naartoe.


5. Gebruik context om gerelateerde records vooraf in te vullen

Met context-waarden kun je standaarden meegeven bij het aanmaken van gerelateerde records vanuit de dropdown (bijv. automatisch het huidige project invullen). Dat beperkt handmatige invoer en verbetert dataconsistentie.

Veelvoorkomende valkuilen


Vergeten van de inverse One2Many

Het ontbreken van de inverse One2Many leidt vaak tot gebruikersklachten: men kan van het gerelateerde record niet eenvoudig alle verwijzende records vinden. Dat resulteert vaak in ad-hoc zoekopdrachten of extra rapporten om het gemis te compenseren.


Cascade-verwijdering zonder na te denken

ondelete='cascade' op operationele koppelingen kan desastreus zijn: het verwijderen van een categorie kan ongewenst alle gekoppelde producten verwijderen. Meestal is 'set null' of 'restrict' verstandiger voor bedrijfsdata.


Niet checken op False bij Python-navigatie

Lege Many2One-velden geven een lege recordset terug. Als je code rechtstreeks order.partner_id.name aanroept zonder te controleren, krijg je vaak een lege string, wat stilzwijgend foutieve output kan produceren wanneer je meerdere niveaus navigeert. Controleer altijd op leegte als het veld niet verplicht is.


Verwijzen naar het verkeerde model

res.partner bevat klanten, leveranciers, contacten en bedrijven. Zonder domain zie je alles in de dropdown, wat tot verkeerde keuzes leidt. Definieer een domain dat overeenkomt met de zakelijke bedoeling van het veld.


Overmatig gebruik waar een Selection volstaat

Als de mogelijke waarden klein en statisch zijn, is een Selection-veld vaak eenvoudiger en sneller. Many2One brengt een extra model en join met zich mee; gebruik het wanneer waarden omvangrijk, bewerkbaar door gebruikers of gedeeld tussen modellen zijn.

Samenvatting


Het Many2One-veld verbindt gegevens tussen modules en is dus niet alleen iets voor ontwikkelaars. Analisten, consultants en power users die met Studio werken profiteren enorm van begrijpen wanneer en hoe je dit veld inzet.


Belangrijke geheugensteuntjes: creëer de inverse One2Many, gebruik domain-filters om dropdowns relevant te houden, bepaal ondelete bewust, en kies een Selection als de opties klein en onveranderlijk zijn.


Of je nu via Studio configureert, een Python-module schrijft of de API gebruikt, een juiste modellering van relationele velden vanaf het begin maakt je Odoo-implementatie betrouwbaarder en makkelijker te onderhouden.

Bij Dasolo begeleiden we bedrijven bij implementatie, maatwerk en optimalisatie van Odoo over alle afdelingen heen. Of je hulp nodig hebt bij een helder datamodel, het toevoegen van relationele velden of het bouwen van een module vanaf nul, wij ondersteunen je graag. Contacteer ons en laten we jouw Odoo-project bespreken.

Many2One-veld in Odoo: De Complete Handleiding
Dasolo 6 maart 2026
Deel deze post
Aanmelden om een reactie achter te laten