Hoppa till innehåll

Sparade Computed Fields i Odoo — Den Kompletta Guiden

Lär dig vad lagrade beräknade fält är i Odoo, när de verkligen behövs – och hur du skapar dem både med Python-kod och direkt i Odoo Studio.
6 mars 2026 av
Sparade Computed Fields i Odoo — Den Kompletta Guiden
Dasolo
| Inga kommentarer ännu

Introduktion


Om du jobbat med Odoo har du säkert sett fält som räknar fram sitt värde automatiskt. Ett lagrat beräknat fält går ett steg längre: värdet beräknas av kod och sparas faktiskt i databasen så att det kan användas som vilken kolumn som helst.


Skillnaden är viktig. Ett fält som bara räknas ut i stunden kan inte effektivt sökas, filtreras eller grupperas i databasen. Ett lagrat fält däremot finns i tabellen och kan indexeras, exporteras och användas i rapporter utan att systemet behöver göra beräkningen varje gång.


Den här guiden förklarar allt praktiskt du behöver veta om lagrade beräknade fält i Odoo: hur de fungerar i datamodellen, hur du skapar dem med Studio eller i Python, användningsområden i verkliga affärsflöden samt vanliga misstag att undvika.

Vad är ett lagrat beräknat fält i Odoo


I Odoos ORM representerar varje fält en bit data på en modell. De flesta fält fylls i av användaren, men ett beräknat fält får sitt värde från en Python-funktion istället för från manuellt inmatade värden.


Ett lagrat beräknat fält är kort sagt ett beräknat fält med store=True. När någon av dess beroenden ändras körs beräkningsfunktionen och resultatet skrivs till databasen så att värdet finns kvar mellan transaktioner.


I Python följer mönstret en enkel struktur:

total_amount = fields.Float(
    string='Total Amount',
    compute='_compute_total_amount',
    store=True,
)

@api.depends('quantity', 'unit_price')
def _compute_total_amount(self):
    for record in self:
        record.total_amount = record.quantity * record.unit_price

Det är parametern store=True som avgör att fältet blir sparat i databasen. Utan den kommer värdet att räknas om varje gång fältet läses, men det skrivs aldrig ner i tabellen.


I användargränssnittet ser ett lagrat beräknat fält ut som vilket annat fält som helst. Det syns i formulär, listor och rapporter, och användare kan filtrera och gruppera på det — det finns ingen visuell markering som säger att värdet egentligen är beräknat.


Lagrade vs ej lagrade beräknade fält

Att förstå skillnaden är grundläggande för all Odoo-utveckling:

  • Ej lagrat beräknat fält: beräknas varje gång det läses. Kan inte användas i sök-, filter- eller grupperingsterm. Kravar ingen lagringsplats men kan inte utnyttjas i SQL-frågor.
  • Lagrad beräknat fält: beräknas när beroenden ändras och skrivs till databasen. Sökbart, filtrerbart och exportvänligt — tar upp utrymme precis som en vanlig kolumn.

Valet handlar inte om bättre eller sämre i alla lägen, utan om vad du behöver. Om fältet bara visas i ett formulär räcker ofta ett ej lagrat fält. Om du behöver söka, sortera eller aggregera, välj lagrat.

Hur fältet fungerar


När du definierar ett lagrat beräknat fält i Odoo skapar ORM automatiskt triggrar för omberäkning baserat på fälten du anger i @api.depends()-deklarationen.


När något av dessa beroenden ändras märker Odoo posten som i behov av omberäkning, kör compute-metoden och skriver tillbaka resultatet till databaskolumnen.


Livscykeln för omberäkning

Så här går processen i praktiken, steg för steg:

  1. En användare eller ett automatiserat jobb ändrar ett fält som listas i @api.depends().
  2. Odoo upptäcker förändringen och bestämmer vilka poster som påverkas.
  3. Compute-metoden anropas för de identifierade posterna.
  4. Det beräknade värdet skrivs till databasen.
  5. Fältet är nu uppdaterat och kan användas i sökningar, filter och export.

I normalfallet sker detta synkront i samma transaktion. Vid stora batchoperationer kan Odoo dock skjuta upp vissa omberäkningar och hantera dem i bakgrunden för att undvika långa svarstider.


Beroenden över relaterade modeller

@api.depends() stöder punktnotation för fält på relaterade modeller. Exempelvis:


@api.depends('partner_id.country_id.name')
def _compute_country_name(self):
    for record in self:
        record.country_name = record.partner_id.country_id.name or ''

Med sådan punktnotation spårar Odoo ändringar både i partner_id, country_id och name över modellgränser. Om landets namn ändras på partnern triggas omberäkning för alla relaterade poster — en väldigt kraftfull funktion i ramen för Odoo.


Effekt på databasen

Eftersom fältet är lagrat skapas en riktig kolumn i PostgreSQL-tabellen. Det innebär att fältet används direkt i SQL-frågor; sökningar och filter på lagrade beräknade fält blir snabba och effektiva precis som på vanliga kolumner.

Affärsscenarier


Praktiska exempel från verkliga arbetsflöden


1. Försäljning: marginalprocent på orderrader

Säljteamet vill snabbt se marginalen per orderrad. Ett lagrat fält kan ta pris och kostnad, räkna ut marginalprocenten och lagra den på raden. Då kan säljchefen filtrera och gruppera order efter marginalband och identifiera olönsamma rader utan manuell beräkning.


2. CRM: dagar utan aktivitet på en lead

Ett lagrat fält på leads kan beräkna antal dagar sedan senaste planerade aktivitet. Kombinera detta med ett schemalagt jobb som omberäknar varje morgon, så kan säljarnas lista filtreras på inaktivitet och ingen lead faller mellan stolarna.


3. Lager: nettotillgänglig kvantitet

För artiklar med komplexa lagerregler kan ett lagrat fält hålla ett förberäknat värde, t.ex. tillgängligt saldo minus reserveringar. Eftersom värdet är sparat kan produktansvariga sortera och filtrera listor utan att Odoo måste köra tunga lagerberäkningar i realtid för varje rad.


4. Redovisning: antal förfallna fakturor per kund

På kundkortet kan ett lagrat fält räkna hur många fakturor som är förfallna. Ekonomiteamet kan då snabbt sortera kunder efter antal förfallna fakturor — något som bara fungerar om värdet finns sparat i databasen.


5. Tillverkning: total uppskattad arbetstid

I en stycklista kan ett lagrat fält summera uppskattad tid för alla arbetsoperationer. Produktionsplanerare kan sedan filtrera och sortera stycklistor efter total arbetstid för kapacitetsplanering. När en operation läggs till eller ändras uppdateras totalen automatiskt.

Skapa eller anpassa fältet


Två huvudsakliga sätt att skapa lagrade beräknade fält i Odoo är via Odoo Studio för enkla fall eller via Python i en egen modul för full kontroll.


Använda Odoo Studio

I Studio kan du lägga till beräknade fält utan kod. När du skapar ett nytt heltal, decimaltal eller monetärt fält kan du ange en formelliknande expression. Studio hanterar beroendespårningen åt dig i enkla situationer.


Studio passar bra när logiken är en enkel aritmetisk formel mellan fält på samma post. Men om du behöver fält från relaterade modeller, vill ha villkorlig logik eller aggregat över barnposter räcker inte Studio — då behövs en anpassad modul.


Det är en viktig avvägning i din Odoo-anpassning: Studio är snabbt för triviala fall, medan Python ger full flexibilitet när logiken blir komplex.


Använda en egen Python-modul

För allt utöver enkla formler definierar du fältet i Python i en egen modul. Ett konkret exempel är att lägga till ett marginalfält på sales order lines:


from odoo import models, fields, api

class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'

    x_margin_pct = fields.Float(
        string='Margin %',
        compute='_compute_margin_pct',
        store=True,
        digits=(5, 2),
    )

    @api.depends('price_unit', 'purchase_price')
    def _compute_margin_pct(self):
        for line in self:
            if line.price_unit:
                line.x_margin_pct = (
                    (line.price_unit - line.purchase_price) / line.price_unit
                ) * 100
            else:
                line.x_margin_pct = 0.0

När modulen installeras skapar Odoo kolumnen x_margin_pct i databasen, kör compute-metoden över befintliga poster och börjar sedan spåra ändringar i price_unit och purchase_price.


Prefixet x_ är en vedertagen konvention för anpassade fält i Odoo för att undvika namnkonflikter med kärnfält — en standardpraxis inom Odoo-utveckling.


Göra ett lagrat beräknat fält redigerbart

Beräknade fält är som standard skrivskyddade. Vill du tillåta manuella ändringar måste du definiera en inverse-metod som beskriver hur en manuell ändring ska uppdatera källdata. Det är användbart när beräkningen ska fungera som standardvärde men kunna överstyras vid behov.


Odoo Studio-fält och XML-RPC API

Om du skapar fält via XML-RPC kan du provisera vanliga fält med modellen ir.model.fields. Men för lagrade beräknade fält med egen Python-logik måste compute-funktionen finnas på servern i en modul. API:t är bra för att provisionera enkla fält i automatiserade deployment-flöden, men själva logiken måste ligga i en installerad modul.

Riktlinjer och god praxis


Här är de praxisregler som erfarna Odoo-konsulter följer när de jobbar med lagrade beräknade fält.


Specificera alla beroenden noggrant

@api.depends() måste lista varje fält som compute-metoden läser. Glömmer du något uppdateras inte fältet när det beroendet ändras. Gå igenom din kod rad för rad och lista varje fältåtkomst i dekoratorn.


Håll compute-metoder snabba

Compute-metoden körs för varje påverkat record. I en trafikerad Odoo-installation kan det handla om tusentals poster samtidigt. Undvik extra databasfrågor inne i compute-metoden när det går — använd de fält som redan är lästa istället för att göra nya sökningar.


Använd store=True bara när det behövs

Lagrade fält använder diskutrymme och skapar skrivoperationer vid varje omberäkning. Om du endast visar värdet i ett formulär och aldrig behöver filtrera eller gruppera på det är ett ej lagrat fält ett lättare val. Besluta medvetet, inte per automatik.


Hantera kantfall i compute-metoden

Ta alltid höjd för tomma eller saknade värden i din beräkningslogik. Division med noll, saknade relaterade poster och null-värden är vanliga källor till tysta fel. Lägg in kontroller och säkra standardvärden när beräkningen inte kan genomföras normalt.


Planera för initial omberäkning på stora tabeller

När du lägger till ett nytt lagrat fält omberäknas det för alla befintliga rader i tabellen. På en tabell med hundratusentals rader kan det ta lång tid. Testa migreringen i staging och planera för eventuell driftstörning eller att köra omberäkningar i bakgrunden vid produktsättning.


Undvik cirkulära beroenden

Om fält A beror på fält B och fält B beror på fält A kommer Odoo att kasta fel vid modulinladdning. Designa beroenden så de flödar i en tydlig riktning.

Vanliga fallgropar


Glömma store=True

Det vanligaste misstaget är att utelämna store=True. Fältet ser rätt ut i formuläret under test, men när någon försöker filtrera eller använda det i rapporter fungerar det inte. Bestäm tidigt om fältet behöver vara sökbart — om ja, ange store=True direkt.


Saknat beroende i @api.depends

Om din compute-metod läser partner_id.country_id men du bara deklarerar partner_id i dekoratorn kommer fältet inte att uppdateras när land ändras. Följ hela fältvägen och lista varje steg i dekoratorn.


Tysta fel i compute-metoden

Om compute-metoden kastar ett undantag för en post hoppar Odoo tyst över omberäkningen för den posten och lämnar det tidigare sparade värdet. Felet hamnar i serverloggen men visas inte för användaren, vilket kan leda till svårspårade felaktiga värden. Testa alltid mot poster med saknade eller ovanliga data.


Prestandaproblem på stora dataset

En compute-metod som fungerar i utveckling kan bli flaskhals i produktion när tabellen växer. Räkna hur många databasfrågor din metod triggar per post — en extra fråga per post gånger tiotusentals poster blir snabbt mycket tungt.


Användning av sudo() i compute-metoder

Att använda sudo() för att kringgå åtkomsträttigheter i en compute-metod är en säkerhetsrisk. Om beräknat värde exponerar data som användaren inte borde se undergräver det Odoos rättighetsmodell. Använd sudo() endast om du noggrant har övervägt konsekvenserna.


Att förvänta sig omedelbar omberäkning i alla scenarier

I interaktiva operationer är omberäkning oftast synkron, men vid batchimporter, bakgrundsjobb eller vid vissa ORM-operationer kan Odoo skjuta upp omberäkningar. Bygg inte affärslogik som förutsätter att värdet alltid är uppdaterat vid skrivtid — verifiera beteendet i den kontext där fältet används.

Sammanfattning


Sammanfattningsvis är lagrade beräknade fält ett kraftfullt verktyg i Odoo. De automatiserar beräkningar, håller data konsekvent och gör fält sökbara och exportbara utan manuella insatser från användarna.


Viktiga att ta med sig:

  • Använd store=True när du behöver att fältet ska vara sökbart, filtrerbart eller exportbart.
  • Deklarera alltid alla beroenden i @api.depends(), även över modellgränser.
  • Håll compute-metoder snabba och hantera kantfall uttryckligen.
  • För enkla formler är Odoo Studio ett snabbt val—för komplex logik skriv Python i en modul.
  • Planera för initial omberäkning när du deployar till produktion på stora tabeller.

Oavsett om du bygger en ny modul, utökar en befintlig modell eller utforskar Odoo-fälttyper för första gången är lagrade beräknade fält ett område värt att förstå väl. De länkar samman ORM, databasen och din affärslogik.


Behöver du hjälp med din Odoo-implementation?

Dasolo hjälper företag att implementera, anpassa och optimera Odoo för olika behov. Behöver du lägga till beräknade fält, bygga rapporter på beräknade värden eller ta din Odoo-utveckling vidare har vårt team erfarenheten att stödja dig.


Hör av dig om du vill ha stöd i ditt Odoo-projekt. Vi diskuterar gärna ditt fall och hittar en lösning som passar din verksamhet.

Sparade Computed Fields i Odoo — Den Kompletta Guiden
Dasolo 6 mars 2026
Dela detta inlägg
Logga in att lämna en kommentar