Inleiding
Als je tijd hebt doorgebracht met werken binnen het Odoo-datamodel, ben je waarschijnlijk situaties tegengekomen waarin je een waarde van een gekoppeld record direct op een formulier moet weergeven, zonder de gebruiker te vragen om door te klikken naar een ander model. Het Gerelateerde veld is hoe Odoo dit op een nette, declaratieve manier oplost.
In plaats van een berekend veld met een Python-methode te schrijven, leest een Gerelateerd veld eenvoudig door een bestaande relationele keten en stelt de waarde aan het einde ervan bloot. Het is een van de meest nuttige tools in de Odoo-ontwikkelaarsgids, en het is ook toegankelijk voor bedrijfsconsultants die met Odoo Studio werken en contextuele informatie willen tonen zonder code te schrijven.
Deze gids legt uit wat het Gerelateerde veld opslaat, hoe het werkt in het Odoo-framework, hoe je het kunt aanmaken en configureren via Studio of Python, en waar het past in echte zakelijke workflows.
Wat is het Gerelateerde Veld in Odoo
In de Odoo ORM is een Gerelateerd veld geen distinct veldtype op dezelfde manier als Float of Char dat zijn. In plaats daarvan is het een snelle toegang die een veld van een ander model blootlegt door een keten van relationele velden te volgen. Het Gerelateerde veld neemt het type aan van welk veld het ook maar aan het einde van de keten wijst.
Het eenvoudigste voorbeeld: een verkooporder heeft een partner_id veld (een Many2one dat verwijst naar res.partner). Een gerelateerd veld gedefinieerd als related='partner_id.country_id' zou het land van de klant direct op de verkooporder blootstellen, zonder een aparte kopie ervan op te slaan.
Vanuit het perspectief van de gebruiker lijkt een gerelateerd veld precies zoals elk ander veld in de formulierweergave. Als het terminale veld in de keten een Char is, wordt het gerelateerde veld weergegeven als een tekstinvoer. Als het een Many2one is, wordt het weergegeven als een dropdown. Als het een Boolean is, toont het een selectievakje. Het gerelateerde veld erft de visuele presentatie van het veld dat het weerspiegelt.
Standaard zijn gerelateerde velden alleen-lezen en niet opgeslagen in de database. Dit betekent dat ze altijd de huidige waarde van het brondocument tonen, maar je kunt geen records filteren of zoeken met behulp van deze velden in een domein, tenzij je store=True instelt.
In Odoo Studio is het gerelateerde veld beschikbaar wanneer je een nieuw veld aan een formulier toevoegt. Je selecteert een bestaand relationeel pad, en Studio maakt het veld met de juiste configuratie aan. Dit maakt het een van de praktischere Odoo Studio-velden voor consultants die formulieren willen verrijken zonder enige Python te schrijven.
Hoe het Veld Werkt
Wanneer Odoo een gerelateerd veld leest, volgt het de keten van veldnamen gescheiden door punten. Elke stap in de keten (behalve de laatste) moet een relationeel veld zijn: een Many2one, One2many of Many2many. Het laatste veld in de keten kan elk type zijn.
Hier is een eenvoudig voorbeeld van een gerelateerd veld gedefinieerd in een Python-module:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
partner_country_id = fields.Many2one(
related='partner_id.country_id',
string='Klantland',
store=True,
)
In dit voorbeeld volgt Odoo partner_id om het res.partner record te bereiken, en leest vervolgens country_id daarvan. Het resultaat is een Many2one-veld op de verkooporder dat het land van de klant weerspiegelt.
Opgeslagen vs. Niet-opgeslagen Gerelateerde Velden
Dit is het belangrijkste onderscheid om te begrijpen. Standaard heeft een gerelateerd veld store=False, wat betekent dat het elke keer dat het record wordt gelezen, on-the-fly wordt berekend. De waarde leeft niet in de database tabel voor het model.
Met store=True schrijft Odoo de waarde naar de databasekolom wanneer het brondocument verandert. Dit maakt filteren, groeperen en zoeken op het gerelateerde veld mogelijk, wat het veel nuttiger maakt voor rapporten en lijstweergaven.
De afweging is dat opgeslagen gerelateerde velden database ruimte verbruiken en een update-trigger vereisen telkens wanneer de bron verandert. Odoo behandelt dit automatisch via zijn afhankelijkheid-tracking systeem, maar het is goed om je hiervan bewust te zijn voor prestatiegevoelige modellen met veel records.
Alleen-lezen versus Schrijfbare Gerelateerde Velden
Standaard zijn Gerelateerde velden alleen-lezen. Door readonly=False toe te voegen, wordt het veld bewerkbaar. Wanneer een gebruiker de waarde wijzigt, schrijft Odoo deze terug via de keten naar het brondocument. Dit is een krachtige maar potentieel verrassende gedraging: het bewerken van het Gerelateerde veld op een verkooporder wijzigt eigenlijk het partnerrecord, niet de order zelf.
Gebruik schrijfbare Gerelateerde velden alleen wanneer je oprecht deze schrijfgedrag wilt. Het kan in sommige contexten zeer nuttig zijn, zoals een snel-bewerkbaar veld in een lijstweergave, maar het kan ook leiden tot onbedoelde gegevenswijzigingen als gebruikers niet begrijpen wat ze aan het bewerken zijn.
Belangrijke Veldattributen
Dit zijn de belangrijkste parameters die je configureert op een Gerelateerd veld:
- related: De punt-gescheiden keten van veldnamen (bijv.
'partner_id.country_id'). Dit is het enige vereiste attribuut. - store: Stel in op
Trueom de waarde in de database op te slaan. Maakt filteren en groeperen mogelijk. - readonly: Stel in op
Falseom gebruikers toe te staan het veld te bewerken, wat door schrijft naar de bron. - string: Het label dat aan gebruikers wordt weergegeven. Standaard is dit het label van het terminal veld.
- depends: Normaal gesproken niet nodig, aangezien Odoo afhankelijkheden automatisch afleidt van de
relatedketen. Alleen nodig in uitzonderlijke gevallen.
Hoe het Interageert met de Odoo ORM
Het lezen van een Gerelateerd veld retourneert de waarde van het terminal veld op het gekoppelde record. Als een link in de keten leeg is (bijvoorbeeld, partner_id is niet ingesteld), retourneert het Gerelateerde veld False. Dit is standaard Odoo ORM-gedrag en is van toepassing op alle relationele velden in het Odoo-datamodel.
Gerelateerde velden worden volledig ondersteund in domeinen, weergaven en rapporten wanneer ze zijn opgeslagen. Niet-opgeslagen gerelateerde velden kunnen worden weergegeven in formulier- en lijstweergaven, maar ze kunnen niet worden gebruikt als filtercriteria in een zoekdomein, tenzij de server ze in Python evalueert in plaats van in SQL.
Zakelijke Gebruikscases
Gerelateerde velden komen bijna overal voor in een Odoo-implementatie. Hier zijn vijf praktische voorbeelden uit echte bedrijfsworkflows.
CRM en Verkoop: Klanttelefoon op Verkooporders
Een veelgestelde vraag van verkoopteams is om het klanttelefoonnummer direct op het verkooporderformulier te zien, zonder dat ze het klantrecord afzonderlijk hoeven te openen. Een gerelateerd veld gedefinieerd als related='partner_id.phone' op sale.order lost dit onmiddellijk op. Het toont het telefoonnummer in context, versnelt verkoopgesprekken en vereist geen extra ontwikkelingsinspanningen. In Odoo Studio kan een consultant dit in minder dan een minuut toevoegen met de optie Gerelateerd veld.
Boekhouding: Bedrijfscurrency op Factuurlijnen
In multi-company Odoo-opstellingen moeten accountants soms de bedrijfscurrency direct op factuurlijnen weergeven voor rapporthelderheid. Een gerelateerd veld zoals related='move_id.company_id.currency_id' schakelt door twee Many2one-velden om de currency te bereiken. Deze keten van drie niveaus is geldig, hoewel het over het algemeen wordt aanbevolen om ketens kort te houden om prestatie-redenen. Het opslaan van dit veld maakt het mogelijk om facturen te filteren op bedrijfscurrency in analytische rapporten.
Voorraad: Productcategorie op Voorraadbeweginglijnen
Magazijnteams die voorraadbewegingen beheren, moeten vaak de productcategorie zien zonder elk productrecord te openen. Een gerelateerd veld op stock.move.line dat naar product_id.categ_id wijst, toont de categorie direct op de beweginglijn. Met store=True maakt dit het mogelijk om binnenkomende en uitgaande voorraad te groeperen op productcategorie in de rapportweergaven van de voorraad, wat bijzonder nuttig is voor bedrijven die een breed scala aan productfamilies beheren.
Productie: Interne Referentie op Werkordercomponenten
Productiemanagers in productiebedrijven moeten vaak de interne productreferentie op de lijnen van werkordercomponenten zien tijdens de productie. Een gerelateerd veld dat product_id.default_code leest op mrp.workorder lijnen plaatst het referentienummer precies waar de operator het nodig heeft, waardoor fouten door het selecteren van vergelijkbare producten worden verminderd. Dit soort kleine aanpassing heeft een echte impact op de nauwkeurigheid op de productievloer.
Tijdregistraties en Projecten: Afdeling van de Werknemer
Wanneer projectmanagers de tijdregistratielijnen bekijken, moeten ze soms zien tot welke afdeling de werknemer behoort voor kostenallocatiedoeleinden. Een gerelateerd veld gedefinieerd als related='employee_id.department_id' op account.analytic.line (het tijdregistratiemodel) toont de afdeling direct op de tijdregistratie-invoer. Opgeslagen met store=True, maakt het het mogelijk om tijdregistraties te filteren op afdeling in projectanalyse-rapporten, waardoor Odoo een completer projectmanagement- en middelenallocatietool wordt.
Een Gerelateerd Veld Aanmaken of Aanpassen
Er zijn drie hoofdmethoden om een Gerelateerd veld toe te voegen aan een Odoo-model, afhankelijk van je technische context en hoe de implementatie wordt beheerd.
Odoo Studio gebruiken (Geen code)
Odoo Studio stelt je in staat om Gerelateerde velden toe te voegen zonder enige Python te schrijven. Hier is hoe je het doet:
- Open Odoo Studio vanuit het hoofdmenu.
- Navigeer naar het formulier waar je het veld wilt toevoegen.
- Klik op Een veld toevoegen en kies Gerelateerd Veld.
- Selecteer het relationele pad door stap voor stap door de beschikbare velden te klikken.
- Geef het veld een label en configureer of het opgeslagen of alleen-lezen moet zijn.
- Sla op en sluit Studio.
Studio maakt automatisch het veld aan met een x_studio_ prefix en plaatst het in de weergave. Dit is een van de meest efficiënte manieren om Odoo Studio-velden te gebruiken voor het toevoegen van contextuele informatie aan bestaande formulieren. Er zijn geen databasewijzigingen aan jouw kant nodig.
Python gebruiken in een Aangepaste Module
Voor ontwikkelaars die aan Odoo-aanpassingen via code werken, worden Gerelateerde velden gedefinieerd in de modelklasse. Dit is de aanpak die wordt aanbevolen door de Odoo-ontwikkelaarsgids voor alle wijzigingen die versiebeheer en multi-omgeving implementatie vereisen:
from odoo import fields, models
class StockMoveLine(models.Model):
_inherit = 'stock.move.line'
product_category_id = fields.Many2one(
related='product_id.categ_id',
string='Productcategorie',
store=True,
)
Na het definiëren van het veld, voeg het toe aan de relevante weergave-XML zodat het in de interface verschijnt. Odoo beheert de creatie van de databasekolom automatisch tijdens de installatie of upgrade van de module. Dit is de standaard ontwikkelingsaanpak van Odoo voor betrouwbare, onderhoudbare Odoo-aanpassingen.
Gebruik van de XML-RPC API
Voor implementaties die programmatisch worden beheerd, bijvoorbeeld via een extern configuratienotitieboek, kunnen gerelateerde velden worden aangemaakt via de XML-RPC API door de related eigenschap in te stellen op de velddefinitie:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_partner_country_id',
'field_description': 'Klantland',
'model_id': sale_order_model_id,
'ttype': 'many2one',
'relation': 'res.country',
'related': 'partner_id.country_id',
'store': True,
'readonly': True,
'state': 'manual',
}]
)
Bij het creëren van een gerelateerd veld via de API, moet je het juiste ttype en relation handmatig specificeren, aangezien de API het type niet automatisch afleidt uit de keten zoals de Python ORM doet. Dit is de aanpak die Dasolo gebruikt voor het op afstand implementeren van Odoo-veld aanpassingen via geautomatiseerde configuratiescripts.
Beste Praktijken
1. Sla het veld op wanneer filteren of groeperen nodig is
Als gebruikers een lijstweergave moeten filteren op het gerelateerde veld, of records ernaar moeten groeperen in een draaitabel, voeg dan store=True toe. Zonder dit is filtering op database-niveau niet mogelijk, en zou Odoo alle records in Python moeten laden om de filter toe te passen, wat niet schaalbaar is. Voor alleen-weergave velden in formulierweergaven is niet-opgeslagen perfect in orde.
2. Houd de keten zo kort mogelijk
Een keten van twee niveaus zoals partner_id.country_id is schoon en performant. Een keten van vier niveaus zoals picking_id.sale_id.partner_id.country_id introduceert meer potentiële foutpunten en is moeilijker te onderhouden. Als je merkt dat je zeer diepe ketens aan het bouwen bent, overweeg dan of een berekend veld met expliciete Python-logica duidelijker en gemakkelijker te debuggen zou zijn.
3. Begrijp wat readonly=False eigenlijk betekent
Een schrijfbaar gerelateerd veld creëert geen lokale kopie van de gegevens. Het wijzigt het brondocument. Als je partner_id.phone bewerkbaar maakt op een verkooporder, wordt het wijzigen ervan de partnerrecord in res.partner bijgewerkt. Die wijziging heeft invloed op elk ander document dat aan die partner is gekoppeld. Zorg ervoor dat dit opzettelijk is, en informeer altijd gebruikers wanneer een veld een gedeeld record bewerkt.
4. Gebruik gerelateerde velden voor weergave, niet voor gegevensduplicatie
Gerelateerde velden zijn bedoeld om bestaande gegevens in context weer te geven, niet om ze te dupliceren. Als je merkt dat je een onafhankelijke kopie van een waarde wilt hebben die kan afwijken van de bron, is een regulier veld met een standaard ingesteld door een onchange of geautomatiseerde actie de juiste aanpak, niet een gerelateerd veld met store=True en readonly=False.
5. Controleer de implicaties van toegangsrechten
Een gerelateerd veld leest door naar een ander model. Als de huidige gebruiker geen leesrechten heeft voor dat model, kan het veld stilletjes een lege waarde retourneren. Dit is correct Odoo-beveiligingsgedrag, maar het kan gebruikers verwarren die een leeg veld zien zonder te begrijpen waarom. Bij het ontwerpen van formulieren met gerelateerde velden, controleer of de verwachte gebruikersrollen leesrechten hebben voor alle modellen in de keten.
Veelvoorkomende Valkuilen
Filteren op een niet-opgeslagen gerelateerd veld
Dit is de meest voorkomende fout. Een ontwikkelaar of consultant voegt een gerelateerd veld toe aan een lijstweergave en probeert vervolgens een zoekfilter daarop toe te voegen. Als store=False (de standaard), kan Odoo niet filteren op dit veld op database-niveau. Het domein zal ofwel een foutmelding geven of stilletjes geen resultaten retourneren. Voeg altijd store=True toe aan elk gerelateerd veld dat je van plan bent te gebruiken in zoekfilters of group-by clausules.
Onverwacht schrijfgedrag
Het instellen van readonly=False op een gerelateerd veld en dan verrast zijn dat bewerkingen de bronrecord beïnvloeden is een zeer veelvoorkomend probleem, vooral wanneer gerelateerde velden worden toegevoegd via Odoo Studio door gebruikers die niet vertrouwd zijn met de mechanismen. Bevestig altijd met de zakelijke belanghebbenden of ze willen dat bewerkingen terugkeren naar het bronnemodel voordat je een gerelateerd veld bewerkbaar maakt.
Niet omgaan met lege tussenliggende velden
Als een veld in de keten leeg is, retourneert het gerelateerde veld False. In een formulierweergave betekent dit meestal dat het veld leeg wordt weergegeven. In een berekend veld of een Python-methode die de waarde van het gerelateerde veld leest, moet je de False geval afhandelen om TypeErrors te voorkomen. Dit is gemakkelijk over het hoofd te zien tijdens het testen wanneer alle records toevallig volledige gegevens hebben, maar het komt naar voren in productie wanneer optionele velden leeg worden gelaten.
Gebruik van gerelateerd waar een berekend veld geschikter is
Gerelateerde velden werken goed wanneer je een enkel veld door een relationele keten spiegelt. Wanneer je enige logica, transformatie of voorwaardelijk gedrag op de waarde moet toepassen, is een berekend veld met een Python-methode de juiste keuze. Proberen om voorwaardelijke logica door een keten van gerelateerde velden te doen, leidt tot oplossingen die moeilijk te onderhouden zijn en gemakkelijk te breken zijn bij toekomstige Odoo-upgrades. Dit is een veelvoorkomend punt in elke Odoo technische tutorial over veldtypen.
Prestatieproblemen met veel opgeslagen Gerelateerde velden op grote modellen
Elk opgeslagen Gerelateerd veld vereist een update wanneer de bronwaarde verandert. Als je tien opgeslagen Gerelateerde velden toevoegt aan een model met honderden duizenden records, en de bronvelden vaak worden bijgewerkt, kun je een aanzienlijke schrijfbelasting op de database creëren. Voor grootschalige Odoo-ontwikkeling, evalueer de prestatie-impact van opgeslagen Gerelateerde velden en geef de voorkeur aan niet-opgeslagen alleen-weergavevelden waar real-time nauwkeurigheid niet kritisch is.
Conclusie
Het Gerelateerde veld is een van de meest praktische tools die beschikbaar zijn in het Odoo-framework voor het naar voren brengen van contextuele informatie zonder gegevens te dupliceren. Het stelt je in staat om door relationele ketens te lezen, waarden van gekoppelde records direct in elke weergave weer te geven, en optioneel die waarden op te slaan voor filtering en rapportage.
Begrijpen wanneer je store=True moet gebruiken, wanneer readonly=False geschikt is, en hoe je lege tussenliggende velden moet behandelen, zal je tijd besparen en de meest voorkomende gegevensproblemen in Odoo-implementaties voorkomen. Of je nu een ontwikkelaar bent die Python-modules schrijft, een consultant die Odoo Studio gebruikt, of een technisch leider die remote configuraties beheert, het Gerelateerde veld is het waard om goed te kennen.
Als je een Odoo-gegevensmodel bouwt of uitbreidt, horen Gerelateerde velden in je toolkit thuis naast Gecalculeerde velden, Many2one-velden en de andere Odoo-veldtype die in deze serie worden behandeld.
Bij Dasolo helpen we bedrijven bij het implementeren, aanpassen en optimaliseren van Odoo in Sales, Operations, Accounting en meer. Als je hulp nodig hebt bij het ontwerpen van je Odoo-gegevensmodel, het toevoegen van aangepaste velden aan je workflows, of het uitbreiden van je Odoo-opstelling met betrouwbare, onderhoudbare code, staan we voor je klaar. Neem contact met ons op en laten we bespreken hoe we je Odoo-project kunnen ondersteunen.