Introduktion
I Odoo bestämmer modeller hur informationen sparas och organiseras i databasen. All affärsdata — allt från offerter och fakturor till artiklar — levs i modeller som definierar fälten, relationerna och reglerna för just den informationstypen.
Att förstå Odoo-modeller är avgörande både för utvecklare och funktionella konsulter. Modellerna utgör grunden i Odoos datalager: här man anger fälttyper, relationer mellan poster och var affärslogiken sitter. Mönstren är återkommande — lär du dig dem blir det lättare att navigera hela systemet.
Den här texten handlar om en av de viktigaste modellerna i Odoo: product.template. Oavsett om du sätter upp produktkataloger, bygger integrationer eller utvecklar tilläggsmoduler kommer du stöta på den här modellen ofta.
Vad är modellen product.template
Modellen product.template används för att beskriva en produktfamilj — en grundläggande produkt där några varianter (till exempel färg eller storlek) skiljer sig åt. I stället för att skapa separata artiklar för varje liten variant lägger man attributen på templaten och låter varianterna ärva det gemensamma.
product.template spelar roll i många delar av Odoo: försäljning, inköp, lager, e-handel och produktion. När du lägger upp en artikel i katalogen skapar du en template, och i kundorder väljer du vanligtvis en specifik variant som är kopplad till den templaten.
Själva definitionen ligger i produktmodulen, men många andra moduler bygger på eller förlänger den via Odoos arvssystem. Försäljning tillsätter priser och faktureringslogik, inköp lägger på leverantörsinställningar och lager ansvarar för spårning — utan att duplicera kärnstrukturen.
Skillnaden mellan product.template och product.product är central: templaten innehåller det delade, generella innehållet, medan product.product representerar en konkret variant med egna värden som SKU eller streckkod.
Viktiga fält i modellen
Nedan följer en lista över de viktigaste fälten i product.template och varför de betyder något i praktisk användning — känna till dem ger tydligare konfigurationer och enklare felsökning.
1. name
Typ: Char. Produktens synliga namn — det du oftast ser i listor, på offerter och i sökningar. Ett tydligt namn underlättar både användning och automatisering.
2. create_date
Typ: Datetime. Tidpunkt då posten skapades. Automatiskt spårat och nyttigt för rapporter, uppföljning och historik.
3. write_date
Typ: Datetime. Tidpunkt för senaste ändring. Hjälper att avgöra om informationen är aktuell och vem som senast uppdaterade den.
4. active
Typ: Boolean. Mjuk arkivering — sätt till False för att gömma en produkt utan att ta bort den permanent. Bra för säsongsartiklar eller utgågna produkter.
5. sequence
Typ: Integer. Styr sorteringsordningen i listor och dropdowns. Lägre värden visas först och kan användas för att prioritera produkter i gränssnittet.
6. type
Typ: Selection. Produktkategori: Consumable, Service eller Storable. Bestämmer om lagerspårning och hantering krävs för artikeln.
7. categ_id
Typ: Many2one (product.category). Produktkategori påverkar rapportering, standardrutterna och struktur i katalogen. Kategorier kan vara uppdelade hierarkiskt.
8. list_price
Typ: Float. Försäljningspris som används som förslag i offerter. Pricelistor eller varianter kan skriva över detta.
9. standard_price
Typ: Float. Kostnadspris som påverkar marginal- och värderingsberäkningar. Viktigt för lönsamhetsrapporter och lagervärde.
10. currency_id
Typ: Many2one (res.currency). Valuta för prisfält som list_price och standard_price. Vanligtvis kopplat till företagets valuta.
11. uom_id
Typ: Many2one (uom.uom). Enhet för försäljning — hur mängder uttrycks (st, kg, liter). Påverkar order- och lagerhantering.
12. uom_po_id
Typ: Many2one (uom.uom). Enhet för inköp — kan skilja sig från försäljningsenheten och kräver omräkning vid beställning.
13. default_code
Typ: Char. Intern referens eller artikelkod. Används ofta som SKU och i integrationer mot externa system för id- och matchning.
14. barcode
Typ: Char. Streckkod för skanning i POS och lager. För varianter placeras streckkoden vanligtvis på product.product.
15. description
Typ: Char. Intern beskrivning som syns för medarbetare i Odoo — praktiskt för interna anteckningar och instruktioner.
16. description_sale
Typ: Text. Kundvänlig beskrivning som visas på offerter, fakturor och i webbutiken. Kan innehålla formatering för bättre presentation.
17. description_purchase
Typ: Text. Information riktad till leverantörer, synlig på inköpsorder och fakturor för tydlighet vid beställning.
18. sale_ok
Typ: Boolean. Avgör om produkten får säljas. Om False visas den inte i försäljningsformulär eller kataloger.
19. purchase_ok
Typ: Boolean. Avgör om produkten får köpas. När False syns den inte i inköpsflödet.
20. weight
Typ: Float. Vikt för fraktberäkningar och logistik; enhet beror på företagets UoM-inställningar.
21. volume
Typ: Float. Volym för planering av lagerutrymme och frakt.
22. product_variant_ids
Typ: One2many (product.product). Lista över varianter som hör till templaten — varje variant är en konkret artikel med egna värden.
23. product_variant_count
Typ: Integer. Räknat fält som visar antal varianter — praktiskt för filter och visning i gränssnitt.
24. image_1920
Typ: Binary. Produktbild som används i formulär, katalog och webb. Odoo lagrar flera storlekar för prestanda.
25. responsible_id
Typ: Many2one (res.users). Den ansvarige för produkten — användbar för uppgifter, godkännanden och uppföljning.
26. company_id
Typ: Many2one (res.company). Anger vilket företag i en multi-company-miljö som produkten tillhör.
27. tax_ids
Typ: Many2many (account.tax). Kundskatter som appliceras vid försäljning och fakturering.
28. supplier_tax_id
Typ: Many2many (account.tax). Leverantörsskatter som används vid inköp och leverantörsfakturor.
29. attribute_line_ids
Typ: One2many. Attributrader som definierar vilka egenskaper (t.ex. storlek, färg) som genererar varianter.
30. route_ids
Typ: Many2many (stock.route). Styr hur artikeln rör sig i leveranskedjan — t.ex. Buy, Make to Order eller dropship.
31. property_stock_production
Typ: Many2one (stock.location). Produktionsplats för tillverkade artiklar — viktig vid produktion och receptstyrning.
32. property_stock_inventory
Typ: Many2one (stock.location). Standardlokation för lagerjusteringar och inventeringar.
33. property_valuation
Typ: Selection. Värderingsmetod: Automatisk eller Manuell — påverkar lagerredovisningen starkt.
34. property_cost_method
Typ: Selection. Kostnadsmetod: Standard eller FIFO — avgör hur lagervärdet beräknas över tid.
35. property_account_income_id
Typ: Many2one (account.account). Intäktskonto relaterat till produkten som används vid fakturering.
36. property_account_expense_id
Typ: Many2one (account.account). Kostnadskonto för inköp som används i leverantörsfakturor.
37. invoice_policy
Typ: Selection. Faktureringspolicy: fakturera vid order eller vid leverans — påverkar intäktsredovisning och orderhantering.
38. expense_policy
Typ: Selection. Kostnadspolicy: bokför kostnad vid beställning eller leverans.
39. service_type
Typ: Selection. För tjänsteprodukter: Manual, Timesheet eller Milestones — styr hur tjänsten mäts och faktureras.
40. optional_product_ids
Typ: Many2many (product.template). Valbara produkter som visas som tillval i offerter för korsförsäljning eller paket.
Hur modellen används i affärsprocesser
1. Försäljning och offerter
Säljare plockar produkter från katalogen när de skapar offerter. Templaten ger basinformationen — om produkten har attribut väljs en specifik variant vid orderläggningen.
2. E-handel
På webbshoppen presenteras templaten i produktlistor och produktsidor. Bilder och gemensam beskrivning kommer från templaten medan kunden väljer variant i detaljvyn.
3. Inköp och leverantörer
Inköpsorder och leverantörsfakturor refererar templaten. Fält som purchase_ok, supplier_tax_id och uom_po_id styr hur inköp visas och hanteras.
4. Lager och produktion
Lagertransaktioner och tillverkningsordrar pekar på varianterna. Templaten styr rutter, värdering och kostnadsmetoder medan lagersaldon hålls per variant.
5. Fakturering
Fakturor och leverantörsfakturor använder produktrader kopplade till templaten för att få rätt skatter och bokföringskonton. Invoice_policy påverkar när intäkten skall bokföras.
Hur utvecklare utökar modellen
Utvecklare bygger på product.template med hjälp av Odoos arv och ett par etablerade mönster för att lägga till fält, logik eller kopplingar.
Modellarv
Genom att ärva modellen (_inherit = 'product.template') kan du lägga in nya fält, skriva över metoder eller lägga till constraints utan att ändra kärnmodulen. Det ger renare uppgraderingar och minskar krockar mellan moduler.
Lägga till fält
Definiera nya fälttyper i din ärvda modell — välj lämplig typ (Char, Many2one, Boolean, Integer, Text, Selection). Tänk på om fältet ska vara företagsspecifikt i multi-company-scenarion.
Python-förlängningar
Överskugga metoder som create, write eller unlink för att injicera affärslogik. Anropa alltid super() när det behövs och var försiktig med beräknade fält och deras beroenden.
Odoo Studio
Odoo Studio gör det enkelt att lägga till fält utan kod — bra för snabba anpassningar. För komplex logik eller långsiktigt underhåll rekommenderas dock moduler och kodbaserade lösningar.
Bra arbetssätt
- Lägg delad information på templaten och variant-specifika värden på product.product — följ den relationen konsekvent för att undvika dataduplikat och förvirring.
- Sätt kategorier korrekt (categ_id) för att dra nytta av standardrutterna och rätt i rapporterna — kategorisering underlättar automatiska regler.
- Använd default_code för integrationer och extern matchning. Försök hålla interna koder konsekventa och unika där det är möjligt.
- Vid API-integrationer, använd Odoos XML-RPC eller JSON-RPC och mappa externa IDn noggrant. product.template är fullt tillgänglig via API:et, så strukturera överföringen efter templaten/varianterna.
- När du skapar egna fält, prefiksera dem (t.ex. med x_ eller modulnamn) för att undvika kollisioner med framtida Odoo-uppdateringar.
Vanliga misstag
- Att skapa separata templates istället för att använda attribut och varianter leder ofta till redundans. Använd attribute_line_ids för att hantera små skillnader (storlek, färg) som varianter.
- Förväxla inte product.template med product.product — variant-specifik data som streckkod eller SKU ska ligga på product.product.
- Glöm inte att markera sale_ok eller purchase_ok korrekt — produkter med dessa satta till False kommer inte att synas i respektive flöde.
- Att skriva över kärnmetoder utan att anropa super() kan leda till oförutsedda problem och göra framtida uppgraderingar svårare.
- Lägga till obligatoriska fält utan standardvärden kan bryta befintliga poster vid uppdateringar — tänk på migrering och bakåtkompatibilitet.
Avslutning
product.template är en central byggsten i Odoo som beskriver produktfamiljer och delad information. Kännedom om dess fält och hur andra moduler lägger till funktionalitet gör det enklare att konfigurera och integrera systemet.
Oavsett om du arbetar med katalogmappning som konsult eller bygger moduler som utvecklare, kommer en god förståelse för product.template att minska tiden för felrättning och ge stabilare lösningar.
Kom igång med Dasolo
Dasolo hjälper företag med implementation, anpassning och optimering av Odoo. Vi är specialiserade på API-integrationer och utveckling, och har stor erfarenhet av Odoos datamodeller som product.template.
Behöver du stöd med implementation, skräddarsydda moduler eller systemintegrationer hjälper vi gärna till. Boka en demo för att prata om ditt projekt.