Odoos ORM (Object-Relational Mapping) hanterar allt mellan Python-koden och databasen. Du skapar fält, definierar beräkningar och Odoo sköter resten. Computed fields och onchange-metoder är två av de mest använda verktygen.
Computed fields
Ett fält vars värde beräknas automatiskt. Totalbelopp = antal * styckpris. I Python: total = fields.Float(compute='_compute_total'). Metoden _compute_total körs varje gång beroende fält ändras.
Använd @api.depends('quantity', 'unit_price') för att ange vilka fält som triggar omberäkning. Odoo optimerar: beräkningen körs bara när ett beroende fält faktiskt ändras, inte vid varje läsning.
Stored computed fields
Lägg till store=True och värdet sparas i databasen. Fördelen: du kan söka, filtrera och gruppera på det. Nackdelen: det tar plats och kräver omberäkning vid ändring. Använd det för fält du behöver i rapporter och listor. Ej stored för fält som bara visas i formulärvyn.
Onchange
@api.onchange('partner_id') triggas i realtid när användaren ändrar fältet i formuläret. Bra för att förifylla relaterade fält: välj kund, fyll automatiskt i adress och betalvillkor. Onchange körs i webbläsaren (client-side) innan posten sparas.
Skillnaden
Computed fields beräknas vid läsning (eller vid beroende ändring om stored). Onchange triggas vid interaktion i formuläret. Computed fields fungerar överallt (API, import, automatisering). Onchange fungerar bara i formulärvyn.
Vanliga misstag
Glömma @api.depends på computed fields (värdet beräknas aldrig om). Använda onchange för affärslogik som borde vara en constraint eller en computed field. Beroendekedjor: A beror på B som beror på C, glöm inte att deklarera hela kedjan.