Hoppa till innehåll

Så Fixar Du “ValueError: Expected Singleton” i Odoo

Förstå och åtgärda felet "expected singleton" i Odoo — en praktisk guide för användare och utvecklare. Vi går igenom vad felet betyder på ett enkelt sätt, vanliga situationer som ger upphov till det och konkreta steg-för-steg-lösningar så att du snabbt kan hitta och fixa problemet i dina moduler eller anpassningar.
17 februari 2026 av
Så Fixar Du “ValueError: Expected Singleton” i Odoo
Elisa Van Outrive
| Inga kommentarer ännu

Inledning


Om du arbetat med Odoo en tid har du troligen stött på ett särskilt felmeddelande som dyker upp när kod och data inte är i synk:


ValueError: Expected singleton

Det här är ett av de vanligaste ORM-relaterade felen i Odoo. Felet uppstår när en metod är skriven för att hantera ett enda register, men i körning får flera register. Medan själva meddelandet låter tekniskt är orsaken ofta enkel att förstå när man känner till hur Odoos recordsets fungerar.


Den här guiden beskriver vad felet betyder, varför det dyker upp och konkreta sätt att rätta till det utan att rubba din affärslogik eller integrationer.

Vad betyder “Expected Singleton” i Odoo?


Odoos ORM arbetar primärt med så kallade recordsets — inte enstaka objekt. Ett recordset kan vara:

  • Ett enda register
  • Flera register
  • Inga register alls

När en metod som förväntar sig ett enda register körs med ett recordset som innehåller flera, kastas följande fel:


ValueError: Expected singleton

Kortfattat:

Odoo förväntade sig ett register. Fick flera.

Det här felet syns vanligtvis i:

  • Serverloggar
  • Metoder i egna moduler
  • Beräknade fält
  • Knapp-aktioner i gränssnittet
  • Automatiska åtgärder/workflows
  • Större massuppdateringar eller importer

Att förstå hur recordsets beter sig är avgörande för att lösa problemet på rätt sätt.



Varför uppstår det här felet


 

1. Missförstånd kring recordsets


I Odoo är self i praktiken nästan alltid ett recordset.

Det innebär att även om du tror att du arbetar med ett enda objekt så kan plattformen anropa din metod med flera poster samtidigt, till exempel vid:

  • Batch-åtgärder i listvyn
  • Automatiska workflows eller schemalagda jobb
  • Serveråtgärder som körs på valda poster
  • API-importer som skriver flera rader i samma anrop

Om din kod antar ett enda register kommer den därför att krascha när fler kommer in.


2. Saknat loop i en metod


Ett vanligt misstag är att skriva logik som bara fungerar för ett objekt utan att iterera.

Exempel på problematisk kod: def action_confirm(self): self.state = 'confirmed'

När self innehåller flera poster blir det oklart vilken post som ska uppdateras — och då uppstår felet.


Korrekt tillvägagångssätt:


def action_confirm(self): for record in self: record.state = 'confirmed'

3. Felaktig användning av ensure_one()


Odoo erbjuder ett verktyg för att garantera att metoden bara körs på ett register.


self.ensure_one()

Detta tvingar fram att exakt ett register används — om det finns fler kastas Expected Singleton medvetet.


Använd ensure_one() endast när affärsregeln verkligen kräver ett enda register, till exempel när du öppnar en formulärvy eller skapar en entydig resurs.


4. Sökningar som returnerar flera poster


Ett annat vanligt scenari0 är när en search() råkar matcha mer än ett objekt.


Exempel: partner = self.env['res.partner'].search([('name', '=', 'John')])

Om flera partners heter ’John’ och senare kod förutsätter bara en, får du samma fel.


Säkrare alternativ:


partner = self.env['res.partner'].search([('name', '=', 'John')], limit=1)

5. Relationsfält som ger tvetydighet


Felet involverar ofta Many2one eller One2many-relationer där kopplingen inte är entydig.


Ett annat vanligt scenari0 är när en search() råkar matcha mer än ett objekt.


Till exempel: self.order_line.product_id.name

Om order_line innehåller flera rader blir uttrycket tvetydigt — du måste hantera varje rad eller välja en specifik post.

Så åtgärdar du felet Expected Singleton


 

Åtgärd — steg för steg


Grundregel i Odoo: anta alltid att self kan innehålla flera poster.


Arbeta därför med iteration som standard.

for record in self: record.process_logic()

Använd limit=1 när det verkligen bara är logiskt att välja ett objekt.


När endast ett register är relevant, specificera det aktivt.


record = self.env['model.name'].search(domain, limit=1)

Granska relationsfält noggrant.


Kontrollera att dina Many2one- eller One2many-fält inte lämnar plats för flera träffar när du förväntar dig en.


  • Verkställ kontroller för Many2one-relationer
  • Hantera One2many-kollektioner med loopar eller aggregeringar
  • Använd tydliga domäner

Säkerställ att du inte av misstag arbetar med flera rader.


Gå igenom API:er och importflöden


I system med mycket integration orsakar ofta batchjobb och importer singleton-fel när flera poster behandlas i samma operation.


Om din Odoo-instans synkroniserar eller importerar data från externa system, gör logiken batch-säker och tänk i termer av grupperade operationer.

Hur du förebygger samma fel i framtida Odoo-utveckling



  • Praktiska rekommendationer
  • Anta inte single-record-kontext i dina metoder
  • Testa alltid funktioner med flera markerade poster
  • Använd iteration som standard
  • Lägg till limit=1 medvetet när det behövs

Ha en ren struktur för relationsfält

Hur Dasolo hanterar recordset- och ORM-fel


I komplexa integrationsmiljöer uppstår ofta singleton-problem i automatiska importer eller schemalagda jobb. Att designa metoder som är säkra för batchkörning minskar risken för produktionsproblem.


Expected Singleton är sällan ett ytligt kodfel. I väl strukturerade Odoo-miljöer pekar det ofta på underliggande antaganden om hur recordsets, ORM och dataflöden ska fungera — särskilt i automatiserade processer och beräknade fält.


På Dasolo tar vi ORM-fel på allvar genom att granska hur recordsets hanteras genom hela modulens livscykel. Singleton-problem dyker oftast upp när affärslogik formulerats för enstaka poster men körs mot flera, exempelvis i automatiska arbetsflöden, integrationer eller beräknade fält.


  • För att undvika återkommande singleton-fel fokuserar vi på:
  • Tydliga mönster för iteration över recordsets
  • Ansvarsfull användning av ensure_one()
  • Förutsägbara och exakta domänfilter
  • Ren relationsarkitektur

Kontrollerade automationstriggers



Sammanfattning


Odoos ’Expected Singleton’ är en vanlig ORM-exception som uppstår när kod försöker behandla flera poster fast logiken förutsätter ett enda. Trots att det ofta ser ut som en enkel utvecklarmiss, pekar det många gånger på brister i hur recordsets hanteras i anpassade moduler eller automatiska processer.


Genom att förstå hur Odoos ORM styr recordsets och införa säkra loop- och valideringsmönster kan utvecklare kraftigt reducera förekomsten av det här felet. Strukturerad hantering av poster, explicita kontroller och genomtänkta automationer är viktigt för stabila Odoo-installationer.


När singleton-problem väl åtgärdats kan de istället fungera som värdefulla markörer som förbättrar kodens kvalitet och systemets långsiktiga stabilitet.

Vanliga frågor


Nej. Felet förekommer i Odoo 14, 15, 16 och 17.

Nej. Det är en logisk hanteringsfråga i koden, inte datakorruption.

Nej. Endast när affärsregeln kräver att metoden strikt körs på ett enda register.


Så Fixar Du “ValueError: Expected Singleton” i Odoo
Elisa Van Outrive 17 februari 2026
Dela detta inlägg
Logga in att lämna en kommentar