Introduktion
Når man arbejder med Odoos datamodel, opstår der ofte behov for at vise information fra en tilknyttet post direkte på en formular — uden at brugeren skal åbne en anden post. Related-feltet er Odoos simple løsning: det spejler en værdi fra en anden model og gør den synlig dér, hvor brugeren har brug for sammenhængen.
I stedet for at skrive en beregnet feltmetode i Python følger et Related-felt en kæde af relationer og henter værdien for enden af den kæde. Det er et vigtigt værktøj både for udviklere og for konsulenter, der bruger Odoo Studio til at vise kontekstuel information uden kode.
Denne vejledning beskriver, hvilken type data et Related-felt repræsenterer, hvordan Odoo håndterer det internt, hvordan du opretter det i Studio eller via Python, og hvilke arbejdsprocesser i forretningen det typisk bruges til.
Hvad er et Related-felt i Odoo
I Odoos ORM er et Related-felt ikke en helt ny grundtype som Char eller Float. Tænk på det som en genvej: feltet peger på et andet felt i en anden model ved at følge en navnekæde, og det antager datatypen fra det felt, det ender på.
Et enkelt scenarie: Ordremodulet har en partner-relation (partner_id) til kontaktarket. Et Related-felt med stien partner_id.country_id viser kundens land direkte på ordren — uden at kopiere og gemme en separat værdi lokalt.
For brugeren ser et Related-felt ud og føles som et almindeligt felt i formularen. Hvis terminalfeltet er tekst, får du et tekstfelt; er det en many2one, får du en dropdown; er det en checkbox, får du en checkbox. Visningen arver typen fra det oprindelige felt.
Som udgangspunkt er Related-felter læse‑only og ikke lagrede i databasen. Det betyder, at de altid viser den aktuelle kildeværdi, men ikke kan bruges direkte i databasefiltre eller søgninger, medmindre du aktivt vælger at gemme dem (store=True).
I Odoo Studio kan du tilføje et Related-felt når du redigerer en formular: du vælger blot en relationel sti, giver feltet en etiket og vælger lagring/readonly. Det gør det hurtigt og risikofrit for konsulenter at berige skærmbilleder uden at programmere.
Hvordan feltet fungerer
Når Odoo læser et Related-felt, følger det punktumseparerede navne i kæden. Hvert trin undtagen det sidste skal være en relation (many2one, one2many eller many2many). Sidstnævnte felt i kæden kan være hvilken som helst datatype.
Her er en helt enkel måde at definere et Related-felt i en Python‑model på:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
partner_country_id = fields.Many2one(
related='partner_id.country_id',
string='Customer Country',
store=True,
)
I eksemplet følger Odoo partner_id til res.partner-posten og læser country_id derfra. Resultatet bliver et many2one-felt på ordren, som spejler kundens land.
Lagret vs. ikke-lagret Related-felt
Det vigtigste at forstå er, at Related-felter som standard ikke gemmes (store=False): værdien beregnes ved læsning og ligger ikke i modelens tabelkolonne i databasen.
Sætter du store=True, skriver Odoo værdien til en kolonne, når kildeposten ændres. Det gør feltet brugbart i filtrering, gruppering og rapportering — funktioner som ellers ikke kan udnytte ikke-lagrede felter effektivt.
Ulempen er, at lagrede Related-felter bruger plads og udløser opdateringer, når kilden ændrer sig. Odoo håndterer afhængigheder automatisk, men i systemer med mange poster og hyppige ændringer bør du overveje performance‑konsekvenserne.
Læse‑only vs. skrivbare Related-felter
Som standard er Related-felter skrivebeskyttede. Sætter du readonly=False, bliver feltet redigerbart — og ændringer skrives tilbage gennem kæden til kildemodellen. Det kan være nyttigt, men også overraskende: redigerer du et telefonnummer på en salgsordre, ændrer du faktisk kontaktposten.
Brug kun skrivbare Related-felter, når du bevidst ønsker at skrive igennem til kilden. Det er praktisk fx ved hurtig redigering i lister, men kan føre til utilsigtede konsekvenser, hvis slutbrugerne ikke ved, at de ændrer en delt post.
Væsentlige feltattributter
Her er de vigtigste indstillinger, du typisk konfigurerer på et Related-felt:
- related: Den punktumseparerede sti til kilden (fx 'partner_id.country_id'). Det er det eneste obligatoriske parameter.
- store: Sæt True for at persistere værdien i databasen — nødvendigt for filtre og gruppering.
- readonly: Sæt False for at tillade redigering, hvilket skriver tilbage til kilden.
- string: Den label brugeren ser. Standard er terminalfeltets label.
- depends: Som regel unødvendig, fordi Odoo selv udleder afhængighederne fra related-stien. Brug kun i særlige tilfælde.
Hvordan det spiller sammen med Odoo ORM'en
Når du læser et Related-felt, returneres terminalfeltets værdi fra den tilknyttede post. Hvis et link i kæden er tomt (fx partner_id ikke sat), returnerer feltet False — det er standardadfærden i Odoo‑ORM'en.
Related-felter kan bruges i visninger, domæner og rapporter, men kun fuldt ud når de er lagrede. Ikke-lagrede felter kan vises i formularer eller lister, men kan ikke agere effektivt som søgekriterier i SQL-drevne domæner uden server-side evaluering i Python.
Forretningsscenarier
Her er fem konkrete forretningsbrug, hvor Related-felter ofte giver værdi.
CRM og salg: Kundetelefon på salgsordre
Salgsteam vil ofte have telefonnummeret synligt på ordren uden at åbne kundekortet. Et Related-felt partner_id.phone på sale.order løser det: hurtigere opkald, bedre kontekst og ingen udviklingstid — i Studio kan en konsulent sætte det op på under et minut.
Regnskab: Firmavaluta på fakturalinjer
I multivirksomhedsopsætninger har revisorer nogle gange brug for virksomhedens valuta direkte på fakturalinjerne. Et Related-felt som move_id.company_id.currency_id går to many2one-led igennem for at finde valutaen. Kortere kæder er bedst til performance; lagring gør det muligt at filtrere efter valuta i analyser.
Lager: Produktkategori på pluklinjer
Lagerpersonalet har ofte brug for produktkategorien på en stock.move.line uden at åbne produktkortet. Et Related-felt product_id.categ_id viser kategorien direkte. Med store=True kan man gruppere bevægelser efter kategori i lager-rapporterne — nyttigt ved mange produktfamilier.
Produktion: Intern varekode på arbejdsordrekomponenter
I produktionen vil operatører gerne se den interne referencenummer på komponentlinjer. Et Related-felt der henter product_id.default_code på mrp.workorder-linjer placerer koden lige ved arbejdsstedet og mindsker fejl ved valg af lignende varer.
Tidsregistrering og projekter: Medarbejders afdeling
Projektledere har brug for at se medarbejderens afdeling på timesedler for omkostningsfordeling. Et Related-felt employee_id.department_id på account.analytic.line viser afdelingen direkte. Hvis det er gemt, kan du filtrere og analysere timesedler per afdeling i projektanalyserne.
Oprettelse og tilpasning af Related-feltet
Tre måder at tilføje et Related-felt på afhængigt af dit setup og adgang til kildekode.
Brug af Odoo Studio (ingen kode)
Odoo Studio gør det muligt at tilføje Related-felter uden Python. Fremgangsmåden er enkel:
- Åbn Odoo Studio fra menuen.
- Gå til den formular, hvor feltet skal være.
- Vælg 'Tilføj felt' og vælg 'Related Field'.
- Klik dig igennem relationerne for at opbygge stien trin for trin.
- Angiv et navn og vælg om feltet skal være lagret eller skrivebeskyttet.
- Gem og luk Studio.
Studio opretter feltet med et x_studio_-præfiks og placerer det i visningen. Det er en hurtig måde at tilføje kontekstuelle felter uden at ændre databasen manuelt.
Brug af Python i et custom modul
For udviklere, der arbejder via kode, defineres Related-felter i modelklassen — den anbefalede metode ved versionstyrede ændringer og produktionstyper deployment:
from odoo import fields, models
class StockMoveLine(models.Model):
_inherit = 'stock.move.line'
product_category_id = fields.Many2one(
related='product_id.categ_id',
string='Product Category',
store=True,
)
Efter definitionen tilføjer du feltet i den relevante view-XML, så det vises i UI. Odoo skaber databasekolonnen ved install/upgrade, hvilket giver en stabil og vedligeholdelig løsning til produktionsbrug.
Brug af XML-RPC API'en
I deployments styret programmatisk kan Related-felter oprettes via XML-RPC ved at sætte related-attributten på feltdefinitionen.
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_partner_country_id',
'field_description': 'Customer Country',
'model_id': sale_order_model_id,
'ttype': 'many2one',
'relation': 'res.country',
'related': 'partner_id.country_id',
'store': True,
'readonly': True,
'state': 'manual',
}]
)
Via API skal du ofte angive ttype og relation manuelt, da API'en ikke automatisk infererer terminalfeltets type som ORM'en gør. Denne fremgangsmåde bruges i automatiserede deployments og konfigurationsscripts.
Gode fremgangsmåder
Styling og konfigurationsråd — fem praktiske anbefalinger
1) Gem feltet når du skal kunne filtrere eller gruppere: Hvis feltet skal bruges i søgning eller pivottabeller, skal du sætte store=True, ellers kan søgninger blive ineffektive eller fejle.
2) Hold relationen kort: Kortere kæder er mere robuste og hurtigere. Overvej en beregnet feltmetode, hvis du bygger dybe kæder.
3) Kend konsekvensen af readonly=False: Et redigerbart Related-felt skriver tilbage til kilden — informér brugerne og vær sikker på, at det er tilsigtet.
4) Brug Related-felter til visning, ikke til duplikering: Hvis du har brug for en selvstændig værdi, som må afvige fra kilden, er et separat felt med default eller automatisering bedre.
5) Tjek adgangsrettigheder: Hvis brugeren ikke har læserettighed på en model i kæden, kan feltet blive tomt uden advarsel. Sørg for at relevante roller har korrekt adgang.
Filtrering på ikke-lagrede Related-felter
Det hyppigste fejltrin er at placere et Related-felt i en liste og forsøge at filtrere på det uden at have store=True. Ikke-lagrede felter kan ikke bruges effektivt i databasefiltre — tilføj store=True hvis du vil søge eller gruppere efter feltet.
Uventet skrive‑igennem adfærd
Mange bliver overraskede, når et Related-felt sat readonly=False skriver til basissystemet. Dette sker ofte når non-tekniske brugere opretter felter i Studio uden fuldt overblik. Afstem med forretningen inden du gør Related-felter redigerbare.
Almindelige faldgruber
Håndtering af tomme mellemled
Hvis et mellemtrin i kæden er tomt, returnerer feltet False og vises tomt i UI. I Python‑logik skal du altid håndtere False-tilfældet for at undgå TypeErrors — noget der ofte først opstår i produktion, når felter ikke er obligatoriske.
Brug ikke Related hvor en Computed-felt passer bedre
Related-felter er ideelle til at spejle et enkelt felt gennem relationer. Når du har brug for transformation, betingelser eller logik, er en beregnet feltmetode med eksplicit Python-kode langt mere robust og lettere at vedligeholde.
Performance-problemer ved mange lagrede Related-felter
Hvert lagret Related-felt skal opdateres når kildefeltet ændrer sig. Hvis du har mange lagrede felter på store tabeller og hyppige opdateringer, kan det skabe betydelig database‑belastning. Profiler og vælg ustored felter, hvis realtidsnøjagtighed ikke er kritisk.
Related-feltet er et praktisk værktøj til at vise kontekstuel information uden datadublering. Det lader dig følge relationer og vise værdier fra tilknyttede poster direkte i de visninger, hvor brugerne arbejder.
At vide hvornår du skal bruge store=True, hvornår readonly=False er passende, og hvordan du håndterer tomme mellemled, sparer tid og forhindrer hyppige dataproblemer i Odoo-implementeringer. Uanset om du arbejder som udvikler, konsulent i Studio eller teknisk projektleder, er Related-feltet et must at kende.
Når du bygger eller udvider din Odoo-datamodel, hører Related-felter hjemme i din værktøjskasse sammen med Computed‑felter, Many2one‑relationer og de øvrige felttyper, vi gennemgår i denne serie.
Hos Dasolo hjælper vi virksomheder med at implementere, tilpasse og optimere Odoo inden for salg, drift, regnskab og mere. Hvis I har brug for rådgivning til datamodellering, felter i arbejdsprocesser eller udvidelser med vedligeholdelig kode, kan vi hjælpe.
Konklusion
Kontakt os
og lad os tage en snak om, hvordan vi kan støtte jeres Odoo-projekt.
Når du bygger eller udvider en Odoo-datamodel, bør Related-felter være et fast element i dit værktøjskasse ved siden af beregnede felter (Computed), Many2one og de andre felt-typer, vi gennemgår i denne serie.
Hos Dasolo hjælper vi virksomheder med at implementere, tilpasse og optimere Odoo — fra salg og drift til regnskab og mere. Har du brug for sparring til datamodel-design, vil du tilføje specialfelter til dine processer eller sikre, at udvidelser laves som stabil og vedligeholdelsesvenlig kode, står vi klar til at assistere. Kontakt os og lad os tage en snak om, hvordan vi kan støtte dit Odoo-projekt.