Introduktion
Om du har spenderat tid på att arbeta inom Odoo-datamodellen har du förmodligen stött på situationer där du behöver visa ett värde från en länkad post direkt på ett formulär, utan att be användaren klicka sig vidare till en annan modell. Det relaterade fältet är hur Odoo löser detta på ett rent, deklarativt sätt.
Istället för att skriva ett beräknat fält med en Python-metod, läser ett relaterat fält helt enkelt igenom en befintlig relation och exponerar värdet i slutet av den. Det är ett av de mest användbara verktygen i Odoo-utvecklarhandboken, och det är också tillgängligt för affärskonsulter som arbetar med Odoo Studio och behöver visa kontextuell information utan att skriva kod.
Denna guide förklarar vad det relaterade fältet lagrar, hur det fungerar i Odoo-ramverket, hur man skapar och konfigurerar det genom Studio eller Python, och var det passar in i verkliga affärsarbetsflöden.
Vad är det relaterade fältet i Odoo
I Odoo ORM är ett relaterat fält inte en distinkt fälttyp på samma sätt som Float eller Char är. Istället är det en genväg som exponerar ett fält från en annan modell genom att följa en kedja av relationella fält. Det relaterade fältet tar på sig typen av vilket fält det pekar på i slutet av kedjan.
Det enklaste exemplet: en försäljningsorder har ett partner_id-fält (en Many2one som pekar på res.partner). Ett Relaterat fält definierat som related='partner_id.country_id' skulle exponera kundens land direkt på försäljningsordern, utan att lagra en separat kopia av det.
Ur användarens perspektiv ser ett Relaterat fält exakt ut som vilket annat fält som helst i formulärvyn. Om det terminala fältet i kedjan är en Char, renderas det Relaterade fältet som en textinmatning. Om det är en Many2one, renderas det som en rullgardinsmeny. Om det är en Boolean, visas en kryssruta. Det Relaterade fältet ärver den visuella presentationen av det fält det speglar.
Som standard är Relaterade fält skrivskyddade och inte lagrade i databasen. Detta innebär att de alltid visar det aktuella värdet från källposten, men du kan inte filtrera eller söka poster med dem direkt i ett domän om du inte ställer in store=True.
I Odoo Studio är det Relaterade fältet tillgängligt när du lägger till ett nytt fält i ett formulär. Du väljer en befintlig relationell väg, och Studio skapar fältet med rätt konfiguration. Detta gör det till ett av de mer praktiska Odoo Studio-fälten för konsulter som behöver berika formulär utan att skriva någon Python.
Hur fältet fungerar
När Odoo läser ett Relaterat fält följer det kedjan av fältnamn separerade med punkter. Varje steg i kedjan (utom det sista) måste vara ett relationellt fält: en Many2one, One2many eller Many2many. Det sista fältet i kedjan kan vara av vilken typ som helst.
Här är ett enkelt exempel på ett Relaterat fält definierat i en Python-modul:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
partner_country_id = fields.Many2one(
related='partner_id.country_id',
string='Kundens Land',
store=True,
)
I det här exemplet följer Odoo partner_id för att nå res.partner-posten, och läser sedan country_id från den. Resultatet är ett Many2one-fält på försäljningsordern som speglar kundens land.
Lagrade vs. Olagrade Relaterade Fält
Detta är den viktigaste skillnaden att förstå. Som standard har ett Relaterat fält store=False, vilket innebär att det beräknas på språng varje gång posten läses. Värdet finns inte i databasens tabell för modellen.
Med store=True skriver Odoo värdet till databasens kolumn när källposten ändras. Detta möjliggör filtrering, gruppering och sökning på det Relaterade fältet, vilket gör det mycket mer användbart för rapporter och listvyer.
Nackdelen är att lagrade Relaterade fält förbrukar databasutrymme och kräver en uppdateringsutlösare varje gång källan ändras. Odoo hanterar detta automatiskt genom sitt beroendespårningssystem, men det är värt att vara medveten om för prestandakänsliga modeller med många poster.
Läsa-Only vs. Skrivbara Relaterade Fält
Som standard är Relaterade fält skrivskyddade. Att lägga till readonly=False gör fältet redigerbart. När en användare ändrar värdet skriver Odoo tillbaka det genom kedjan till källposten. Detta är ett kraftfullt men potentiellt överraskande beteende: att redigera det Relaterade fältet på en försäljningsorder modifierar faktiskt partnerposten, inte själva ordern.
Använd endast skrivbara Relaterade fält när du verkligen avser detta skrivgenom-beteende. Det kan vara mycket användbart i vissa sammanhang, som ett snabbredigeringsfält i en lista, men det kan också leda till oavsiktliga datändringar om användare inte förstår vad de redigerar.
Nyckelfältattribut
Dessa är de huvudsakliga parametrarna du konfigurerar på ett Relaterat fält:
- related: Den punktseparerade kedjan av fältnamn (t.ex.
'partner_id.country_id'). Detta är den enda obligatoriska attributen. - store: Sätt till
Trueför att bevara värdet i databasen. Möjliggör filtrering och gruppering. - readonly: Sätt till
Falseför att tillåta användare att redigera fältet, vilket skriver genom till källan. - string: Etiketten som visas för användare. Standardvärdet är etiketten för det terminala fältet.
- depends: Normalt inte nödvändigt eftersom Odoo automatiskt härleder beroenden från
related-kedjan. Endast nödvändigt i kantfall.
Hur det Interagerar med Odoo ORM
Att läsa ett Relaterat fält returnerar värdet av det terminala fältet på den länkade posten. Om någon länk i kedjan är tom (till exempel, partner_id är inte inställt), returnerar det Relaterade fältet False. Detta är standard Odoo ORM-beteende och gäller för alla relationella fält i Odoo datamodell.
Relaterade fält stöds fullt ut i domäner, vyer och rapporter när de är lagrade. Olagrade relaterade fält kan visas i formulär- och listvyer, men de kan inte användas som filterkriterier i en sökdomän om inte servern utvärderar dem i Python snarare än SQL.
Affärsanvändningsfall
Relaterade fält förekommer i nästan varje del av en Odoo-implementation. Här är fem praktiska exempel från verkliga affärsarbetsflöden.
CRM och Försäljning: Kundtelefon på försäljningsorder
En vanlig begäran från försäljningsteam är att se kundens telefonnummer direkt på försäljningsorderformuläret, utan att behöva öppna kundposten separat. Ett relaterat fält definierat som related='partner_id.phone' på sale.order löser detta omedelbart. Det visar telefonnumret i kontext, påskyndar försäljningssamtal och kräver ingen extra utvecklingsinsats. I Odoo Studio kan en konsult lägga till detta på under en minut med hjälp av alternativet för relaterade fält.
Bokföring: Företagsvaluta på fakturalinjer
I Odoo-installationer med flera företag behöver bokförare ibland visa företagsvalutan direkt på fakturalinjer för rapporteringsklarhet. Ett relaterat fält som related='move_id.company_id.currency_id' kedjar genom två Many2one-fält för att nå valutan. Denna tre nivåers kedja är giltig, även om det generellt rekommenderas att hålla kedjor korta av prestandaskäl. Att lagra detta fält möjliggör filtrering av fakturor efter företagsvaluta i analytiska rapporter.
Lager: Produktkategori på lagerflyttlinjer
Lagerteam som hanterar lagerflyttningar behöver ofta se produktkategorin utan att öppna varje produktpost. Ett relaterat fält på stock.move.line som pekar på product_id.categ_id visar kategorin direkt på flyttlinjen. Med store=True möjliggör detta gruppering av inkommande och utgående lager efter produktkategori i lagerreporteringsvyer, vilket är särskilt användbart för företag som hanterar ett brett utbud av produktfamiljer.
Tillverkning: Intern referens på arbetsorderkomponenter
Produktionschefer i tillverkningsföretag behöver ofta se den interna produktreferensen på arbetsorderkomponentlinjer under produktionen. Ett relaterat fält som läser product_id.default_code på mrp.workorder-linjer placerar referensnumret exakt där operatören behöver det, vilket minskar fel som orsakas av att välja liknande produkter. Denna typ av liten anpassning har en verklig inverkan på noggrannheten på produktionsgolvet.
Tidrapporter och Projekt: Anställdas avdelning
När projektledare granskar tidrapporter behöver de ibland se vilken avdelning den anställde tillhör för kostnadsallokeringsändamål. Ett relaterat fält definierat som related='employee_id.department_id' på account.analytic.line (tidrapportsmodellen) visar avdelningen direkt på tidrapportsinmatningen. Lagrad med store=True möjliggör det filtrering av tidrapporter efter avdelning i projektanalysrapporter, vilket gör Odoo till ett mer komplett verktyg för projektledning och resursallokering.
Skapa eller anpassa det relaterade fältet
Det finns tre huvudsakliga sätt att lägga till ett Relaterat fält till en Odoo-modell, beroende på din tekniska kontext och hur distributionen hanteras.
Använda Odoo Studio (Ingen kod)
Odoo Studio låter dig lägga till Relaterade fält utan att skriva någon Python. Så här gör du:
- Öppna Odoo Studio från huvudmenyn.
- Navigera till formuläret där du vill lägga till fältet.
- Klicka på Lägg till ett fält och välj Relaterat fält.
- Välj den relationella vägen genom att klicka igenom de tillgängliga fälten steg för steg.
- Ge fältet en etikett och konfigurera om det ska lagras eller vara skrivskyddat.
- Spara och stäng Studio.
Studio skapar automatiskt fältet med ett x_studio_-prefix och placerar det i vyn. Detta är ett av de mest effektiva sätten att använda Odoo Studio-fält för att lägga till kontextuell information till befintliga formulär. Inga databasändringar behövs från din sida.
Använda Python i en anpassad modul
För utvecklare som arbetar med Odoo-anpassning genom kod definieras Relaterade fält i modellklassen. Detta är den metod som rekommenderas av Odoo-utvecklarguiden för alla ändringar som behöver versionskontroll och distribution i flera miljöer:
from odoo import fields, models
class StockMoveLine(models.Model):
_inherit = 'stock.move.line'
product_category_id = fields.Many2one(
related='product_id.categ_id',
string='Produktkategori',
store=True,
)
Efter att ha definierat fältet, lägg till det i den relevanta vy XML så att det visas i gränssnittet. Odoo hanterar skapandet av databas kolumner automatiskt under modulinstallation eller uppgradering. Detta är den standard Odoo utvecklingsmetoden för pålitlig, underhållbar Odoo anpassning.
Använda XML-RPC API
För distributioner som hanteras programmässigt, till exempel genom en fjärrkonfigurationsnotebook, kan relaterade fält skapas via XML-RPC API genom att ställa in related attributet på fältdefinitionen:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_partner_country_id',
'field_description': 'Kundens land',
'model_id': sale_order_model_id,
'ttype': 'many2one',
'relation': 'res.country',
'related': 'partner_id.country_id',
'store': True,
'readonly': True,
'state': 'manual',
}]
)
När du skapar ett relaterat fält via API:et, behöver du ange rätt ttype och relation manuellt, eftersom API:et inte automatiskt härleder typen från kedjan på samma sätt som Python ORM gör. Detta är den metod som Dasolo använder för att distribuera Odoo fältanpassningar på distans genom automatiserade konfigurationsskript.
Bästa praxis
1. Spara fältet när filtrering eller gruppering behövs
Om användare behöver filtrera en lista vy efter det relaterade fältet, eller gruppera poster efter det i en pivottabell, lägg till store=True. Utan det är databasnivå filtrering inte möjligt, och Odoo skulle behöva ladda alla poster i Python för att tillämpa filtret, vilket inte skalar. För visningsbara fält i formulärvyer är osparat helt okej.
2. Håll kedjan så kort som möjligt
En två-nivå kedja som partner_id.country_id är ren och prestandaeffektiv. En fyra-nivå kedja som picking_id.sale_id.partner_id.country_id introducerar fler potentiella felpunkter och är svårare att underhålla. Om du upptäcker att du bygger mycket djupa kedjor, överväg om ett beräknat fält med explicit Python-logik skulle vara tydligare och lättare att debugga.
3. Förstå vad readonly=False faktiskt betyder
Ett skrivbart relaterat fält skapar inte en lokal kopia av datan. Det modifierar källposten. Om du gör partner_id.phone redigerbart på en försäljningsorder, uppdaterar det partnerposten i res.partner. Den förändringen påverkar varje annat dokument kopplat till den partnern. Se till att detta är avsiktligt, och informera alltid användare när ett fält redigerar en delad post.
4. Använd relaterade fält för visning, inte för dataduplicering
Relaterade fält är avsedda att visa befintliga data i sitt sammanhang, inte att duplicera dem. Om du finner att du vill ha en oberoende kopia av ett värde som kan avvika från källan, är ett vanligt fält med ett standardvärde som sätts av en onchange- eller automatiserad åtgärd rätt tillvägagångssätt, inte ett relaterat fält med store=True och readonly=False.
5. Kontrollera åtkomsträttigheternas konsekvenser
Ett relaterat fält läser genom till en annan modell. Om den aktuella användaren inte har läsbehörighet till den modellen kan fältet tyst returnera ett tomt värde. Detta är korrekt Odoo-säkerhetsbeteende, men det kan förvirra användare som ser ett tomt fält utan att förstå varför. När du utformar formulär med relaterade fält, verifiera att de förväntade användarrollerna har läsbehörighet till alla modeller i kedjan.
Vanliga fallgropar
Filtrering på ett icke-lagringsrelaterat fält
Detta är det vanligaste misstaget. En utvecklare eller konsult lägger till ett relaterat fält i en lista och försöker sedan lägga till en sökfilter på det. Om store=False (standard), kan Odoo inte filtrera efter detta fält på databasnivå. Domänen kommer antingen att ge ett felmeddelande eller tyst returnera inga resultat. Lägg alltid till store=True till alla relaterade fält som du planerar att använda i sökfilter eller gruppera-klausuler.
Oförutsedd skrivgenom-beteende
Att ställa in readonly=False på ett relaterat fält och sedan bli förvånad över att redigeringar påverkar källposten är ett mycket vanligt problem, särskilt när relaterade fält läggs till genom Odoo Studio av användare som är obekanta med mekaniken. Innan du gör ett relaterat fält redigerbart, bekräfta alltid med affärsintressenterna om de vill att redigeringar ska spridas tillbaka till källmodellen.
Att inte hantera tomma mellanliggande fält
Om något fält i kedjan är tomt, returnerar det relaterade fältet False. I en formulärvy betyder detta vanligtvis att fältet visas som tomt. I ett beräknat fält eller en Python-metod som läser det relaterade fältets värde, måste du hantera False-fallet för att undvika TypeErrors. Detta är lätt att förbise i tester när alla poster råkar ha fullständig data, men det dyker upp i produktion när valfria fält lämnas tomma.
Använda Relaterat där ett Beräknat fält är mer lämpligt
Relaterade fält fungerar bra när du speglar ett enda fält genom en relationell kedja. När du behöver tillämpa någon logik, transformation eller villkorsbeteende på värdet, är ett beräknat fält med en Python-metod rätt val. Att försöka göra villkorlig logik genom en kedja av relaterade fält leder till lösningar som är svåra att underhålla och lätta att bryta i framtida Odoo-uppgraderingar. Detta är en vanlig punkt i alla Odoo-tekniska handledningar om fälttyper.
Prestandaproblem med många lagrade Relaterade fält på stora modeller
Varje lagrat Relaterat fält kräver en uppdatering när källvärdet ändras. Om du lägger till tio lagrade Relaterade fält på en modell med hundratusentals poster, och källfälten uppdateras ofta, kan du skapa en betydande skrivbelastning på databasen. För storskalig Odoo-utveckling, profilera prestandapåverkan av lagrade Relaterade fält och föredra olagrade visningsfält där realtidsnoggrannhet inte är kritisk.
Slutsats
Det Relaterade fältet är ett av de mest praktiska verktygen som finns i Odoo-ramverket för att visa kontextuell information utan att duplicera data. Det låter dig läsa genom relationella kedjor, visa värden från länkade poster direkt i vilken vy som helst, och valfritt lagra dessa värden för filtrering och rapportering.
Att förstå när man ska använda store=True, när readonly=False är lämpligt, och hur man hanterar tomma mellanliggande fält kommer att spara dig tid och förhindra de vanligaste datafrågorna i Odoo-implementationer. Oavsett om du är en utvecklare som skriver Python-moduler, en konsult som använder Odoo Studio, eller en teknisk ledare som hanterar fjärrkonfigurationer, är det Relaterade fältet värt att känna väl.
Om du bygger eller utökar en Odoo-datamodell, hör Relaterade fält hemma i din verktygslåda tillsammans med Beräknade fält, Many2one-fält och de andra Odoo-fälttyperna som täcks i denna serie.
På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo inom Försäljning, Drift, Redovisning och mer. Om du behöver hjälp med att designa din Odoo-datamodell, lägga till anpassade fält i dina arbetsflöden, eller utöka din Odoo-installation med pålitlig, underhållbar kod, är vi här för att hjälpa till. Kontakta oss och låt oss diskutera hur vi kan stödja ditt Odoo-projekt.