Introduktion
När du gräver i Odookatalogen stöter du ofta på behovet att visa information från ett annat objekt direkt i ett formulär — utan att användaren behöver öppna det andra registret. Det relaterade fältet är Odos deklarativa verktyg för att plocka in sådana värden smidigt i gränssnittet.
Istället för att skriva en beräknad fältmetod i Python följer ett relaterat fält en kedja av relationer och visar värdet i slutet av kedjan. För både utvecklare och konsulter i Odoo Studio är det ett snabbt sätt att lyfta fram kontextuell data utan att skriva kod.
Den här guiden går igenom vad ett relaterat fält representerar, hur det beter sig i Odoo-ramverket, hur du skapar det via Studio eller i Python, och var det passar in i praktiska arbetsflöden.
Vad är ett relaterat fält i Odoo
I Odos ORM är ett relaterat fält egentligen en genväg — det är inte en ny grundtyp som Char eller Float. Det pekar på ett fält i en annan modell genom en punktseparerad kedja och ärver själva datatypen från målfältet i slutet av kedjan.
Tänk dig en kundorder som pekar på kunden via partner_id. Genom att skapa ett relaterat fält som följer partner_id.country_id kan du visa kundens land direkt på ordern, utan att skapa eller duplicera ett eget värde i ordern.
För användaren ser ett relaterat fält ut som vilket annat formulärfält som helst: textfält om slutfältet är text, dropdown om det är en Many2one, kryssruta om det är boolean. Vyn är densamma som för det fält du speglar.
Som standard är relaterade fält läsbara och inte lagrade i databasen. Det innebär att de alltid visar källvärdets aktuella värde, men att du inte kan använda dem i databasdrivna filter eller grupperingar om du inte aktiverar lagring (store=True).
I Odoo Studio finns alternativet att lägga till ett relaterat fält när du bygger formulär. Du väljer relationsvägen i ett par klick och Studio skapar fältet åt dig — ett utmärkt verktyg för konsulter som snabbt vill lägga till relevant information utan att röra kod.
Hur fältet fungerar
När Odoo läser ett relaterat fält går systemet steg för steg längs kedjan av fältnamn åtskilda med punkter. Alla mellansteg måste vara relationsfält (Many2one, One2many eller Many2many), medan sista leden kan vara vilken fälttyp som helst.
Ett enkelt Pythonexempel visar hur fältet deklareras i en modul.
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 exemplet följer Odoo partner_id till res.partner och läser värdet i country_id. Resultatet blir ett Many2one-fält på ordern som speglar kundens land.
Lagrade kontra icke-lagrade relaterade fält
Det viktigaste att förstå är att relaterade fält per standard är beräknade och inte lagras (store=False). Värdet räknas fram i läsögonblicket och sparas inte i modellens databasrad.
Om du sätter store=True skrivs värdet ner i databasen när källvärdet ändras. Det gör fältet möjligt att filtrera, gruppera och söka på i vyer och rapporter.
Nackdelen är att lagrade relaterade fält kräver utrymme och att Odoo måste uppdatera dem när källinformationen ändras. Ramverket sköter beroendeuppdateringar automatiskt, men det är viktigt att tänka på för stora modeller där prestanda spelar roll.
Skrivskyddade kontra skrivbara relaterade fält
Standardbeteendet är läs-only. Om du explicit anger readonly=False blir fältet redigerbart — och ändringar skrivs tillbaka genom kedjan till källposten. Det kan vara kraftfullt men också förvånande: att ändra fältet på en order kan i praktiken ändra partnern.
Gör bara relaterade fält skrivbara när du uttryckligen vill att ändringar ska propagera till källmodellen. I vissa snabba editeringsfall är det användbart, men det ökar risken för oavsiktliga ändringar om användarna inte förstår vad de gör.
Viktiga attribut för fältet
Här är de centrala parametrarna du brukar konfigurera för ett relaterat fält:
- related: Den punktseparerade kedjan av fältnamn (t.ex. 'partner_id.country_id'). Detta är det enda obligatoriska attributet.
- store: Sätt till True om värdet ska sparas i databasen — nödvändigt för filtrering och gruppering.
- readonly: Sätt till False för att tillåta redigering, vilket då skriver tillbaka till källposten.
- string: Den etikett som visas i gränssnittet. Om du inte anger något används terminalfältets rubrik.
- depends: Vanligtvis onödigt eftersom Odoo redan räknar ut beroenden från related-kedjan; används bara i särskilda undantag.
Hur det spelar ihop med Odoos ORM
När Odoo hämtar värdet returneras terminalfältets innehåll. Om någon länk längs kedjan saknas (t.ex. partner_id är tomt) returneras False — samma beteende som för andra relationsfält.
Relaterade fält fungerar i domäner, vyer och rapporter när de är lagrade. Olägrade fält går att visa i formulär och listor, men kan inte användas effektivt som sökfilter eftersom servern i praktiken behöver utvärdera dem i Python istället för i SQL.
Affärsscenarier
Relaterade fält används i praktiken överallt i Odoo. Nedan följer några konkreta användningsfall från verkliga processer.
CRM och försäljning: kundens telefonnummer på ordern
Säljare vill ofta se kundens telefon direkt i ordervyn. Ett relaterat fält partner_id.phone på sale.order visar numret i kontext, snabbar upp samtalshantering och kräver ingen utveckling — enkelt att lägga till i Studio och direkt användbart för säljteamet.
Redovisning: bolagets valuta på fakturarader
I multi-bolagsscenarier behöver ekonomer ibland visa valuta på fakturarader för tydligare rapportering. Ett relaterat fält som följer move_id.company_id.currency_id når valutan genom två steg. Sådana kedjor fungerar, men håll dem helst korta för bättre prestanda. Om du lagrar fältet blir det möjligt att filtrera och gruppera rapporter per valuta.
Lager: produktkategori på lagerflyttsrader
I lagerhantering vill operatörer se produktkategorin utan att öppna varje produkt. Ett relaterat fält product_id.categ_id på stock.move.line visar kategorin direkt och, om det är lagrat, tillåter gruppering och rapporter efter kategori — särskilt hjälpsamt för företag med stora produktfamiljer.
Produktion: intern artikelreferens på arbetsorderkomponenter
Produktionspersonal behöver ofta snabb åtkomst till intern artikelkod vid plock och montering. Genom att spegla product_id.default_code på mrp.workorder-linjer hamnar referensen där operatören behöver den, vilket minskar risken att fel artikel plockas.
Tidredovisning och projekt: anställdas avdelning
Projektledare vill ibland se vilken avdelning en medarbetare tillhör direkt på tidrapportraden för att fördela kostnader. Ett relaterat fält employee_id.department_id på account.analytic.line visar avdelningen och — om det är lagrat — möjliggör filtrering i projektanalyser.
Skapa eller anpassa ett relaterat fält
Tre sätt att lägga till ett relaterat fält beroende på din tekniska situation:
Genom Odoo Studio (ingen kod)
Studio låter dig lägga till relaterade fält utan kod. Så går det till steg för steg:
- Öppna Odoo Studio i menyn.
- Gå till formuläret där fältet ska visas.
- Klicka på Lägg till fält och välj Relaterat fält.
- Välj relationsvägen genom att klicka dig fram bland tillgängliga fält.
- Sätt en etikett och bestäm om fältet ska lagras eller vara skrivskyddat.
- Spara och stäng Studio.
Studio skapar fältet med prefix x_studio_ och placerar det i vyn — en snabb och smidig metod för att lägga till kontextuell data utan databasändringar från din sida.
Genom Python i en egen modul
För utvecklare är standardvägen att definiera relaterade fält i modellklassen i en modul — lämpligt när du vill ha versionskontroll och trygg distribution över 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='Product Category',
store=True,
)
Efter deklarationen lägger du till fältet i vyns XML så det syns i gränssnittet. Odoo skapar nödvändiga databasfält vid installation eller uppgradering — det här är den robusta vägen för stabila, underhållbara anpassningar.
Via XML-RPC API
Om du hanterar konfigurering programmässigt kan du skapa relaterade fält via XML-RPC genom att sätta related-attributet i fältdefinitionen:
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',
}]
)
När du skapar via API måste du ofta ange ttype och relation manuellt eftersom API:t inte automatiskt härleder dem från kedjan som ORM gör. Detta är en vanlig metod för automatiserad distribution i större installationer.
Rekommenderade riktlinjer
Praktiska råd att följa
1) Spara fältet om du behöver filtrera eller gruppera på det. Utan lagring kan inte databasen effektivt använda fältet i SQL-förfrågningar — skalbarhet blir lidande.
2) Håll kedjan kort. En tvåledare är enkel och snabb; djupa kedjor ökar risken för fel och försämrar underhållbarhet. Överväg en beräknad fältmetod om logiken blir komplex.
3) Förstå konsekvenserna av readonly=False. Ett redigerbart relaterat fält ändrar källposten — det påverkar alla register som delar källan. Kommunicera tydligt till användarna när ett fält har sådan effekt.
4) Använd relaterade fält för visning, inte dataredundans. Om du behöver en oberoende kopia av ett värde bör du istället skapa ett vanligt fält och fylla det via onchange eller automatiserad åtgärd.
5) Kontrollera åtkomsträttigheter. Ett relaterat fält läser igenom andra modeller; om användaren saknar läsrätt på någon länk kan fältet bli tomt utan tydlig förklaring.
Filter på icke-lagrade relaterade fält
En vanlig miss är att lägga till ett relaterat fält i listvyn och försöka filtrera på det utan att sätta store=True. Detta fungerar inte i databasen och leder till fel eller ofullständiga resultat. Sätt store=True om fältet ska användas i filter eller pivottabeller.
Oväntat skrivtillbakaflöde
Att av misstag göra ett relaterat fält skrivbart via Studio och bli förvånad över att den ursprungliga partnern ändras är vanligt. Innan du tillåter redigering, bekräfta med verksamheten att skrivning tillbaka är önskat.
Vanliga fallgropar
Hantera tomma mellanled
Om någon länk i kedjan saknas returneras False och fältet visas tomt. I Python-kod måste du hantera detta för att undvika TypeErrors — särskilt viktigt i produktion där data ofta är ofullständig.
När ett beräknat fält är bättre än ett relaterat
Relaterade fält lämpar sig för att spegla ett enda fält. Om du behöver transformera värdet, göra villkor eller lägga in affärslogik är ett computed-fält i Python rätt väg. Försök att pressa komplexa regler genom related-kedjor blir svårunderhållet.
Prestandaproblem vid många lagrade relaterade fält
Varje lagrat relaterat fält måste uppdateras när källvärdet ändras. På stora modeller kan flera sådana fält skapa hög skrivbelastning. Profilerar du prestanda och välj olagrade visningsfält där realtidsuppdatering inte är kritisk.
Relaterade fält är ett praktiskt verktyg för att visa kontextuell information utan att duplicera data. De låter dig läsa genom relationskedjor och presentera värden från länkade poster direkt i vyer — och vid behov spara dem för rapportering.
Att veta när du ska använda store=True, när readonly=False är lämpligt och hur du hanterar tomma mellanled minskar vanliga dataproblem i Odoo. Oavsett om du är utvecklare, konsult eller systemansvarig är kunskap om relaterade fält viktig.
När du bygger eller utökar datamodellen hör relaterade fält hemma i din verktygslåda tillsammans med beräknade fält, Many2one och övriga fälttyper som behandlats i den här serien.
På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo inom försäljning, drift, ekonomi med mera. Behöver ni stöd med datamodellering, fälttillägg eller robust kod — vi kan assistera.
Sammanfattning
Kontakta oss
så tar vi ett samtal om hur vi kan stötta ditt Odoo-projekt.
När du bygger eller utökar en Odoo-datamodell är relaterade fält ett viktigt verktyg i verktygslådan — precis som beräknade fält, Many2one-relationer och de andra fälttyperna som ofta används i Odoo-utveckling.
På Dasolo arbetar vi med att införa, anpassa och finslipa Odoo-lösningar inom försäljning, drift, redovisning och fler områden. Behöver du stöd med att konstruera din datamodell, lägga till specialanpassade fält i dina processer eller bygga ut din Odoo-miljö med robust och lättunderhållen kod så hjälper vi dig gärna. Kontakta oss så tar vi ett samtal om hur vi kan stötta ditt Odoo-projekt.