Hoppa till innehåll

Float Field i Odoo — Komplett Guide för Utvecklare och Användare

En praktisk guide till fältet float i Odoos datamodell — från grundläggande användning till hantering av precision och avancerade tekniska inställningar
6 mars 2026 av
Float Field i Odoo — Komplett Guide för Utvecklare och Användare
Dasolo
| Inga kommentarer ännu

Introduktion


Decimalfältet är ett av de mest frekvent använda fälttyperna i Odoo när informationen innehåller värden med decimaler. Pris per enhet, produktvikt, rabattprocent, skattesatser och omräkningsfaktorer i stycklistor - dessa värden lagras oftast som decimalfält i Odoodatabasen.


Vid första anblick ser det ut som ett enkelt numeriskt fält, men det finns viktiga detaljer att känna till: precisionen, hur värden rundas och lagras, samt när ett annat fälttypval är bättre för affärslogiken.


Den här guiden förklarar vad ett decimalfält egentligen sparar, hur det beter sig i Odoo-ramverket, hur du skapar och justerar det via Odoo Studio eller i Python, samt konkreta användningsområden inom försäljning, lager och ekonomi.

Vad är ett Decimalfält i Odoo


I Odoo:s ORM representerar ett decimalfält ett tal med flyttal och i databasen mappas det normalt till en kolumn med hög precision. Det ger i praktiken fler signifikanta siffror än vad de flesta företag behöver, men förståelsen för exakt hur många siffror och decimaler som bevaras är viktig för korrekta beräkningar.


För användaren syns decimalfältet som ett numeriskt inmatningsfält i formulär. Antalet visade decimaler styrs av fältets inställningar. I listvyer visas värdena med samma precision och är högerjusterade. I pivottabeller och grafer ingår fältet i summeringar, medelvärden eller andra aggregeringar beroende på fältets konfiguration.


Så här definierar man det i en Python-modell:

from odoo import fields, models

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

    custom_margin = fields.Float(
        string='Custom Margin',
        digits=(5, 2),
        default=0.0,
    )

Parametern för precision fungerar som en tvådelad inställning: första siffran anger totalt antal signifikanta siffror, andra anger antal decimaler. Exempelvis innebär (5, 2) upp till fem signifikanta siffror med två decimaler.

Istället för att hårdkoda siffror kan du också peka på en namngiven precisiongrupp:


price_premium = fields.Float(
    string='Price Premium',
    digits='Product Price',
)

Odoo har färdiga precisiongrupper som administreras i systemets tekniska inställningar, till exempel för produktpris, enhet, rabatt och vikt. Genom att använda dessa grupper kan precisionen ändras via gränssnittet utan kodändringar, vilket gör fälten mer flexibla i drift.


I Odoo Studio heter fälttypen «Decimal Number». När du skapar den via Studio använder den standardprecision om du inte ändrar egenskaperna i fältpanelen. Det gör att affärsanvändare smidigt kan lägga till decimalfält utan utvecklarhjälp.

Så fungerar fältet


När du definierar ett decimalfält i en modul tar Odoo hand om att skapa kolumnen i databasen vid installation eller uppgradering av modulen. Du behöver alltså inte skriva egen SQL eller migrationsskript i det normala fallet.


Digits-parametern påverkar både visning och hur värden rundas innan de sparas. Om du har digits=(6, 2) och en användare matar in 3.14159, kommer värdet att rundas och sparas som 3.14. Denna avrundning sker i ORM-skiktet, inte bara i presentationen.


Viktiga fältattribut

Här är de viktigaste egenskaperna du kan ställa in för ett decimalfält i Odoo:

  • digits: En tuple som (6, 2) eller namnet på en precisiongrupp. Styr både visningsprecision och lagringsprecision.
  • required: Gör fältet obligatoriskt. Observera att ett decimalfält med värdet 0.0 fortfarande anses som ifyllt, vilket ibland leder till oavsiktliga resultat om du förväntar dig ett icke-nollvärde.
  • default: Standardvärde när en ny post skapas. Att sätta default=0.0 säkerställer att fältet har ett numeriskt värde istället för False.
  • compute: Kopplar fältet till en Python-metod som beräknar värdet dynamiskt. Användbart för härledda värden som marginaler eller omräkningar.
  • store: I kombination med compute sparas beräknade värden i databasen så att de kan sökas och grupperas.
  • group_operator: Bestämmer hur fältet aggregeras i pivottabeller och grafer, t.ex. 'sum', 'avg', 'min' eller 'max'. Standard för decimalfält är ofta 'sum'.
  • copy: Avgör om värdet kopieras vid duplicering av en post. Standard är True.

Hur det visas i vyer

I formulärvyer renderas decimalfält som numeriska inmatningar och tar hänsyn till användarens lokala inställningar för decimalavgränsare. I listvyer är värden högerjusterade. I sökfilter kan du använda numeriska jämförelsevillkor för att hitta poster utifrån decimalvärden.


Du kan också applicera widgets på decimalfält i vyerna. Exempelvis visar procentwidgeten värdet multiplicerat med 100 och lägger till en procent-symbol — praktiskt när fältet sparar en andel i 0–1-intervallet men ska visas som 0–100 % för användaren.


Interaktion med Odoo-ORM: läsning och skrivning

När du läser ett decimalfält i Python får du ett flyttal (float) eller False om inget värde är satt och ingen default finns. Vid skrivning accepterar fältet heltal, flyttal eller False, och ORM:en applicerar avrundningen enligt fältets digits vid sparande.


En viktig utvecklarregel: jämför inte decimalvärden med == i Python. Flyttalsaritmetik kan ge överraskningar. Använd istället odoo.tools.float_utils, till exempel float_compare och float_is_zero, som tar hänsyn till den precision du definierat.

Affärsscenarier där det används


Decimalfält förekommer i nästan alla moduler i en Odoo-lösning. Nedan följer fem vanliga exempel från verkliga arbetsflöden.


Försäljning: rabattprocent på orderrader

Det inbyggda rabattfältet på orderraden är ett decimalfält. När en säljare anger 15 % lagras oftast värdet som 15.0 och används i prisberäkningen som går vidare till offerter och fakturor. Korrekt hantering av rabatter är viktigt för kundkommunikation och marginalrapportering.


Lager: vikt och volym för produkter

Produkter har fält för vikt och volym som decimalvärden. En artikel som väger 2.5 kg eller tar 0.003 m3 kräver decimalprecision. Dessa värden används i fraktberäkningar och vid integrationer med transportörer, där felaktiga decimaler kan leda till felaktiga fraktkostnader.


Ekonomi: skattesatser

Skattesatser på kontoplanens skatteposter lagras som decimaler. En moms på 21 % kan sparas som 21.0, och systemet använder dessa värden för att räkna ut momsbelopp på fakturor. Här påverkar precisionen avräkningar och avrundningar i större volymer transaktioner.


Tillverkning: kvantiteter i stycklistor

I tillverkning är komponentkvantiteter i stycklistor decimalvärden. En receptdel kan kräva 0.75 liter eller 2.5 kg av en komponent. Decimalfält möjliggör dessa exakta mängder och minskar risken för produktionsavvikelse som annars skulle uppstå vid avrundning.


Inköp: prisfaktorer och leverantörspåslag

Vid prislistor och påslag lagras multiplikatorer och marginaler som decimaler. En faktor på 1.25 (25 % påslag) eller 0.85 (15 % rabatt) används i automatiska prisberäkningar på inköpsorder för att säkerställa konsekventa priser från leverantörer.

Skapa eller anpassa ett Decimalfält


Tre sätt att lägga till ett decimalfält i en Odoo-modell, beroende på teknisk nivå och distributionssätt.

Med Odoo Studio (ingen kod)

Odoo Studio är verktyget för lågkodsanpassningar. För att lägga till ett decimalfält utan kod:


  1. Öppna Odoo Studio från huvudmenyn.
  2. Gå till det formulär där du vill lägga till fältet.
  3. Dra in ett fält märkt «Decimal Number» från fältväljaren till formuläret.
  4. Sätt etikett, standardvärde och antal decimaler i egenskapspanelen.
  5. Spara och stäng Studio.

Studio skapar fältet med ett x_studio_-prefix och lägger automatiskt till det i formuläret. Ingen databashantering krävs från användaren — detta är ofta det enklaste sättet för affärsanvändare att anpassa systemet.


Med Python i en anpassad modul

För utvecklare definieras decimalfält i Python i modulen — det är rätt metod när ändringar ska versionshanteras och rullas ut i flera systemmiljöer:


from odoo import fields, models

class ResPartner(models.Model):
    _inherit = 'res.partner'

    x_credit_limit = fields.Float(
        string='Credit Limit',
        digits=(12, 2),
        default=0.0,
        help='Maximum outstanding balance allowed for this customer.',
    )

Efter att ha lagt till fältet i modellen inkludera det i relevanta vyer via XML så att det syns i gränssnittet. Odoo sköter kolumnskapandet i databasen vid installation eller uppgradering.


Via XML-RPC API

Om du automatiserar Odoo-konfigurationer med skript eller fjärrverktyg kan du skapa decimalfält via XML-RPC API:

field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_custom_coefficient',
        'field_description': 'Custom Coefficient',
        'model_id': model_id,
        'ttype': 'float',
        'state': 'manual',
    }]
)

Att sätta state: manual markerar att fältet skapats manuellt snarare än av en modul — rätt inställning för fält skapade via Studio eller API. Decimalprecisionen för API-skapade fält hanteras via tekniska inställningar i systemet.

Rekommenderade arbetssätt


1. Använd namngivna precisiongrupper för standardvärden

Istället för att hårdkoda digits=(6, 2), använd en precisiongrupp som 'Product Price' eller 'Product Unit of Measure'. Det låter administratörer finjustera precisionen utan att ändra kod och ger enhetlighet med Odos inbyggda fält.


2. Använd Monetary för penningbelopp — inte Float

Det viktigaste rådet: för belopp som har valuta bör du använda fälttypen Monetary. Den kopplas till ett valutafält, hanterar avrundningar enligt valuta och fungerar korrekt i system med flera valutor. Ett vanligt Float-fält för fakturabelopp eller försäljningspris leder ofta till fel vid rapportering i multi-valuta-miljö.


3. Sätt alltid ett standardvärde

Definiera default=0.0 för numeriska fält som förväntas börja på noll. Utan detta blir fältvärdet False tills användaren fyller i något, vilket kan orsaka oväntade fel i beräknade fält och metoder som antar ett numeriskt värde.


4. Ange group_operator för rapportering

Om fältet representerar ett belopp eller en mängd som ska summeras, ange group_operator='sum'. För procentsatser eller hastigheter där medelvärde är mer meningsfullt, använd 'avg'. Rätt val här säkerställer att pivottabeller och grafer aggregerar data på ett användbart sätt.


5. Dokumentera hur du sparar procentvärden

Var tydlig med konventionen: sparas procent som 0–100 (t.ex. 15.0 för 15 %) eller som 0–1 (t.ex. 0.15 för 15 %)? Blandade konventioner i datamodellen leder till tysta fel och svårfelsökta beräkningsproblem.


Vanliga fallgropar


Att använda Float för penningbelopp

Floatfält innehåller ingen valutainformation. Ett värde på 1500 i ett Floatfält säger inget om valuta. I system med flera valutor ger det felaktiga totalsummor i ekonomiska rapporter — använd Monetary för alla fält som representerar pengar.


Att inte sätta digits-parameter

Om du lämnar digits tomt får du ofta standardprecision på två decimaler. Det fungerar för priser men inte för värden som kräver fyra eller sex decimaler, exempelvis valutakurser eller enhetsomräkningar. En avrundad omräkningsfaktor kan skapa kumulativa fel i många transaktioner.


Att jämföra Float med == i Python

På grund av flyttalsrepresentation kan till synes lika värden inte vara exakt lika vid likhetsjämförelse. Exemplet 0.1 + 0.2 == 0.3 ger False i Python. Använd float_compare och float_is_zero från odoo.tools.float_utils med rätt precision för pålitliga jämförelser.


Att använda Float där Integer är rätt val

Om ett fält alltid innehåller hela tal — antal paket, antal enheter eller ordningsnummer — använd Integer. Att ha decimalfält där ger onödig komplexitet och lockar till att mata in decimaler där de inte hör hemma.


Att inte hantera False i compute-metoder

Ett decimalfält utan default returnerar False när det är tomt. I beräkningsmetoder måste du kontrollera för False innan du gör aritmetik, eller sätta default=0.0 på fältet för att undvika TypeError i skarpa datafall.

Sammanfattning


Decimalfältet är en grundläggande byggsten i Odoo:s datamodell. Det hanterar tal med decimaler för priser, mängder, procentsatser och mått — och fungerar bra så länge du ställer in rätt precision och standardvärden.


De viktigaste punkterna att komma ihåg: använd namngivna precisiongrupper där det är lämpligt, använd Monetary för valuta, sätt alltid ett default-värde och dokumentera hur procentvärden lagras. Dessa enkla vanor minskar risken för datakvalitetsproblem i produktion.

Oavsett om du lägger till fält via Odoo Studio, skriver en modul i Python eller skapar fält programmässigt via ORM eller API — rätt hantering av decimalfält från början ger en renare och mer robust implementation.

Hos Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo i alla avdelningar. Vi kan stödja allt från datamodellsdesign till fullständig modulutveckling. Kontakta oss så pratar vi om ditt Odoo-projekt.

Float Field i Odoo — Komplett Guide för Utvecklare och Användare
Dasolo 6 mars 2026
Dela detta inlägg
Logga in att lämna en kommentar