Hoppa till innehåll

Lagrade Beräknade Fält i Odoo: En Fullständig Guide

Förstå hur lagrade beräknade fält fungerar i Odoo, när man ska använda dem och hur man skapar dem med Python eller Odoo Studio
6 mars 2026 av
Lagrade Beräknade Fält i Odoo: En Fullständig Guide
Dasolo
| Inga kommentarer ännu

Introduktion


Om du har spenderat tid på att arbeta med Odoo har du förmodligen stött på fält som beräknar sitt värde automatiskt. Ett lagrat beräknat fält tar detta ett steg längre: det beräknar värdet och sparar det direkt i databasen.


Denna distinktion är viktigare än vad den kan verka vid första anblicken. Ett fält som bara beräknas i realtid kan inte sökas, filtreras, grupperas eller exporteras effektivt. Ett lagrat beräknat fält kan. Det beter sig som en vanlig databas kolumn samtidigt som det fortfarande drivs av logik som du definierar.


Denna guide täcker allt du behöver veta om lagrade beräknade fält i Odoo: hur de fungerar inom Odoo datamodell, hur man skapar dem med Odoo Studio eller Python, verkliga affärsanvändningsfall och de vanligaste misstagen att undvika.

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


I Odoo ORM håller varje fält på en modell en bit data. De flesta fält lagrar vad användaren anger manuellt. Ett beräknat fält är annorlunda: dess värde genereras av en Python-funktion snarare än att anges av en användare.


E lagrad beräknad fält är helt enkelt ett beräknat fält med store=True. När dess beroenden ändras, kör Odoo beräkningsfunktionen och skriver resultatet i databasens kolumn. Värdet är sedan tillgängligt precis som vilket annat fält som helst.


I Python ser det grundläggande mönstret ut så här:

total_amount = fields.Float(
    string='Totalbelopp',
    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

Parametern store=True är det som skiljer ett lagrat beräknat fält från ett vanligt beräknat fält. Utan det beräknas värdet om varje gång fältet läses men sparas aldrig i databasen.


I Odoo-gränssnittet ser ett lagrat beräknat fält exakt ut som vilket annat fält som helst. Användare ser det i formulär, listvyer och rapporter. De kan filtrera efter det, gruppera poster med det och inkludera det i exporter. Det finns ingen visuell indikator som visar att värdet är beräknat snarare än inmatat.


Lagrat vs Icke-Lagrat Beräknade Fält

Att förstå denna skillnad är avgörande för allt Odoo-utvecklingsarbete:

  • Ej lagrad beräknad fält: Beräknas på språng när den läses. Kan inte användas i filter, sökningar eller gruppering. Lättare för lagring men inte tillgänglig för databasfrågor.
  • Lagrad beräknad fält: Beräknas när beroenden ändras och sparas i databasen. Sökbar, filtrerbar, exportbar. Tar upp utrymme i databasen som vilken vanlig kolumn som helst.

Valet mellan de två handlar inte om vilken som är bättre i allmänhet. Det beror på vad du behöver fältet till. Om du bara visar det på ett enda formulär, är ej lagrad okej. Om du behöver filtrera, sortera eller aggregera efter det, använd lagrad.

Hur fältet fungerar


När du definierar ett lagrat beräknat fält i Odoo, ställer ORM in automatiska omberäkningsutlösare baserat på de fält som anges i @api.depends()-deklarationen.


När något av dessa beroendefält ändras på en post, markerar Odoo den posten som behöver omberäkning. Beräkningsmetoden körs, och resultatet skrivs tillbaka till databasens kolumn för det fältet.


Rekomputationslivscykeln

Här är vad som händer steg för steg:

  1. En användare eller en automatiserad process ändrar ett fält som listas i @api.depends().
  2. Odoo upptäcker ändringen och identifierar alla poster som beror på detta fält.
  3. Beräkningsmetoden anropas för dessa poster.
  4. Det beräknade värdet skrivs till databasens kolumn.
  5. Fältet är nu tillgängligt för sökning, filtrering och export med det uppdaterade värdet.

I de flesta fall sker denna rekalkylering omedelbart inom samma transaktion. För stora batchoperationer kan Odoo skjuta upp vissa rekalkyleringar och bearbeta dem i bakgrunden.


Beroenden över relaterade modeller

Dekoratorn @api.depends() stöder prickade vägar för att komma åt fält på relaterade modeller. Till exempel:


@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 ''

I detta fall spårar Odoo ändringar på partner_id, country_id och name över modeller. Om landsnamnet ändras på en partner, beräknas alla relaterade poster automatiskt om. Detta är en av de mest kraftfulla aspekterna av Odoo-ramverket.


Databasens påverkan

Eftersom fältet är lagrat skapar Odoo en verklig kolumn i PostgreSQL-databastabellen. Detta innebär att fältet deltar i SQL-frågor direkt. Sökningar och filter på lagrade beräknade fält är snabba och effektiva, precis som sökningar på vanliga fält.

Affärsanvändningsfall


Lagrade beräknade fält visas i alla områden av Odoo. Här är fem praktiska exempel från verkliga affärsarbetsflöden.


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

Ett försäljningsteam vill se marginalprocenten på varje försäljningsorder rad utan att öppna en miniräknare. Ett lagrat beräknat fält tar enhetspriset och kostnadspriset, beräknar marginalen och lagrar den på raden. Försäljningschefen kan sedan filtrera order efter marginalprocent, snabbt hitta olönsamma rader och gruppera efter marginalband i pivottabeller.


2. CRM: Dagar utan aktivitet på en lead

Ett lagrat beräknat fält på CRM-leadmodellen kan spåra hur många dagar som har gått sedan den senaste schemalagda aktiviteten. Kombinera detta med en schemalagd åtgärd som utlöser omberäkning varje morgon, så kan ditt försäljningsteam filtrera leads efter inaktivitetsgräns. Ingen manuell uppföljning krävs.


3. Lager: Nettotillgänglig kvantitet

För produkter med komplexa lagerregler kan ett lagrat beräknat fält hålla ett förberäknat värde som tillgänglig kvantitet minus reserverad kvantitet. Eftersom värdet är lagrat kan produktchefer sortera och filtrera produktlistan efter tillgänglighet utan att Odoo kör komplexa lagerberäkningar live för varje rad på skärmen.


4. Redovisning: Antal förfallna fakturor per kund

På kundmodellen kan ett lagrat beräknat fält räkna hur många fakturor som för närvarande är förfallna. När redovisningsteamet öppnar kontaktlistan kan de sortera kunder efter antal förfallna fakturor med ett klick. Detta är endast möjligt eftersom antalet är lagrat i databasen istället för att beräknas på språng för varje rad.


5. Tillverkning: Total uppskattad arbetstid

I en materiallista kan ett lagrat beräknat fält summera den uppskattade varaktigheten över alla arbetscenteroperationer kopplade till BOM. Produktionsplanerare kan sedan filtrera och sortera BOM:er efter total arbetstid, vilket är användbart för kapacitetsplanering och schemaläggning. Varje gång en operation läggs till eller ändras uppdateras totalen automatiskt.

Skapa eller anpassa fältet


Det finns två huvudsakliga sätt att skapa lagrade beräknade fält i Odoo: att använda Odoo Studio för enkla fall, eller att skriva Python-kod i en anpassad modul för full kontroll.


Använda Odoo Studio

Odoo Studio låter dig lägga till beräknade fält utan att skriva någon kod. När du skapar ett nytt fält av typen Integer, Float eller Monetary i Studio kan du aktivera ett formelalternativ som accepterar ett Python-liknande uttryck. Studio hanterar beroendespårningen i bakgrunden.


Beräknade fält i Studio passar bra när logiken är ett enkelt aritmetiskt uttryck mellan fält på samma post. De är lätta att ställa in och kräver ingen utvecklingsmiljö. Men de har verkliga begränsningar. Om din logik involverar relaterade modellfält, villkorsgrenar eller aggregation över barnposter, kommer Studio inte att räcka till. Du kommer att behöva en anpassad modul.


Detta är en viktig åtskillnad när du planerar din Odoo-anpassning: Studio är snabbt för raka fall, men Python ger dig full flexibilitet när logiken blir komplex.


Använda en anpassad Python-modul

För allt som går bortom grundläggande formler definierar du fältet i Python inuti en anpassad Odoo-modul. Här är ett konkret exempel som lägger till ett marginalprocentfält till försäljningsorderlinjer:


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 denna modul installeras skapar Odoo x_margin_pct-kolumnen i databasen, kör beräkningsmetoden för alla befintliga poster och börjar spåra ändringar i price_unit och purchase_price från och med den tidpunkten.


Fältprefixet x_ är konventionen för anpassade fält i Odoo för att undvika konflikter med kärnfält. Detta är standardpraxis inom Odoo-utveckling.


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

Som standard är beräknade fält skrivskyddade. Om du vill att användare ska kunna åsidosätta det beräknade värdet manuellt kan du definiera en inverse-metod tillsammans med din beräkningsmetod. Inverse-metoden körs när en användare skriver direkt till fältet och kan uppdatera källfälten i enlighet därmed. Detta mönster är användbart för fält där det beräknade värdet är ett bra standardvärde men ibland behöver en manuell åsidosättning.


Odoo Studio-fält och XML-RPC API

För team som hanterar Odoo databasfält genom XML-RPC API kan du skapa standardfält via ir.model.fields-modellen. Men för lagrade beräknade fält med anpassad Python-logik måste beräkningsmetoden själv finnas i serverkod. API-ansatsen fungerar bra för att tillhandahålla enkla fält som en del av automatiserade distributioner, men logiken bakom ett beräknat fält kräver alltid en anpassad modul installerad på servern.

Bästa praxis


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


Deklarera alla beroenden noggrant

Dekoratören @api.depends() måste lista varje fält som din beräkningsmetod läser. Om du glömmer ett kommer fältet inte att uppdateras när det beroendet ändras. Gå igenom din beräkningsmetod rad för rad och se till att varje fältåtkomst är listad i dekoratören.


Håll beräkningsmetoder snabba

Din beräkningsmetod körs på varje post som påverkas av en beroendeändring. I en upptagen Odoo-instans kan detta innebära tusentals poster på en gång. Undvik databasfrågor inuti beräkningsmetoder när det är möjligt. Om du behöver komma åt relaterad data, använd de fält som redan är laddade istället för att köra ytterligare sökningar.


Använd endast store=True när du behöver det

Lagrade fält konsumerar databasutrymme och utlöser skrivoperationer vid varje omberäkning. Om du bara behöver visa fältet i en formulärvy och aldrig filtrera eller gruppera efter det, är ett icke-lagrade beräknat fält det lättare alternativet. Gör detta beslut medvetet istället för att automatiskt välja lagrat för allt.


Hantera kantfall i beräkningsmetoden

Ta alltid hänsyn till tomma eller saknade värden inuti din beräkningsmetod. Division med noll, saknade relaterade poster och null-värden är vanliga orsaker till tysta fel i beräknade fält. Lägg till explicita kontroller och ställ in säkra standardvärden när den normala beräkningen inte kan fortsätta.


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

När du installerar en modul som lägger till ett nytt lagrat beräknat fält, omberäknar Odoo det för varje befintlig post i tabellen. På en tabell med hundratusentals rader kan detta ta en betydande tid. Testa din migrering i en staging-miljö först och planera för potentiell stilleståndstid eller bakgrundsbehandling när du distribuerar till produktion.


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 ge ett fel när modulen laddas. Designa dina beroenden för beräknade fält så att de flödar i en enda riktning.

Vanliga fallgropar


Glömma store=True

Detta är det vanligaste misstaget. Fältet visas korrekt i formulärvyn, så allt ser bra ut under testningen. Sedan försöker någon lägga till det som ett filter eller inkludera det i en rapport, och det fungerar inte. Innan du skriver någon beräkningslogik, bestäm på förhand om du behöver att fältet ska vara sökbart. Om ja, lägg till store=True från början.


Saknar ett beroende i @api.depends

Om din beräkningsmetod läser partner_id.country_id men din dekoratör bara listar partner_id, kommer fältet inte att uppdateras när landet ändras på partnerposten. Spåra den fullständiga vägen för varje fältåtkomst i din metod och lista varje steg explicit i dekoratören.


Tysta fel i beräkningsmetoden

Om din beräkningsmetod ger ett undantag för en post, hoppar Odoo tyst över omberäkningen för den posten och behåller det tidigare lagrade värdet. Felet kan visas i serverloggar men inget visas för användaren. Detta kan leda till föråldrade eller felaktiga värden som är svåra att spåra. Testa alltid din beräkningsmetod mot poster som har saknade eller ovanliga data.


Prestandaförsämring på stora dataset

En beräkningsmetod som fungerar bra under utvecklingen kan bli en allvarlig flaskhals i produktion om tabellen växer till tiotusentals poster. Var uppmärksam på hur många databasfrågor din beräkningsmetod utlöser per post. En enda extra fråga per post multiplicerat med tiotusen poster är tiotusen frågor för en enda spara-operation.


Använda sudo() inuti beräkningsmetoder

Att kalla sudo() inuti en beräkningsmetod för att kringgå åtkomsträttigheter är en säkerhetsrisk. Om det beräknade värdet exponerar data som den aktuella användaren inte bör se, motverkar det Odoos behörighetsmodell att returnera det genom en beräkningsmetod. Använd sudo() inuti beräkningsmetoder endast när du noggrant har övervägt säkerhetsimplikationerna.


Förväntar sig omedelbar omberäkning i alla sammanhang

I de flesta interaktiva operationer är omberäkning synkron. Men under batchimporter, bakgrundsjobb eller vissa ORM-operationer med kontextflaggor kan Odoo skjuta upp omberäkning. Bygg inte affärslogik som antar att det lagrade värdet alltid är uppdaterat exakt när en post skrivs. Verifiera beteendet i det specifika sammanhang där ditt fält kommer att användas.

Slutsats


Lagrade beräknade fält är ett av de mest användbara verktygen som finns tillgängliga när du bygger eller utökar Odoo. De låter dig automatisera beräkningar, hålla dina data konsekventa och göra poster sökbara och exportbara utan något manuellt arbete från dina användare.


De viktigaste punkterna att komma ihåg:

  • 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(), inklusive tvärmodellvägar.
  • Håll beräkningsmetoder snabba och hantera kantfall explicit.
  • För enkla formler är Odoo Studio ett snabbt alternativ. För allt mer komplext, skriv Python.
  • Planera för initial omberäkning när du distribuerar till produktion på stora tabeller.

Oavsett om du bygger en ny anpassad modul, utökar en befintlig Odoo-modell eller utforskar Odoo fälttyper för första gången, är lagrade beräknade fält värda att förstå djupt. De sitter i skärningspunkten mellan Odoo ORM, databaslagret och din affärslogik.


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

Dasolo hjälper företag att implementera, anpassa och optimera Odoo för en mängd olika affärsbehov. Oavsett om du behöver lägga till beräknade fält i din datamodell, bygga rapporter drivna av beräknade värden, eller ta din Odoo-utveckling längre, har vårt team erfarenheten för att hjälpa.


Kontakta oss om du behöver stöd med ditt Odoo-projekt. Vi pratar gärna igenom ditt användningsfall och hittar rätt tillvägagångssätt för ditt företag.

Lagrade Beräknade Fält i Odoo: En Fullständig Guide
Dasolo 6 mars 2026
Dela detta inlägg
Logga in att lämna en kommentar