Innledning
Hvis du har brukt Odoo en stund, er sannsynligheten stor for at du har støtt på den beryktede feilmeldingen:
ValueError: Expected singleton
Dette er en av de vanligste ORM-feilene i Odoo. Den dukker opp når en funksjon forventer nøyaktig én post, men får flere. Selv om meldingen virker teknisk, ligger årsaken ofte i hvordan Odoo behandler recordsets — og det er som regel enkelt å rette når du forstår det.
Denne veiledningen forklarer hva Expected Singleton betyr, hvorfor den oppstår og hvordan du retter den uten å bryte forretningslogikk eller integrasjoner.
Hva betyr «Expected Singleton» i Odoo?
Odoo sin ORM (Object Relational Mapping) opererer primært på recordsets, ikke enkeltobjekter. Et recordset kan inneholde:
- Én post
- Flere poster
- Ingen poster
Når Odoo kjører en metode som i praksis skal arbeide med én post, men får et recordset med flere poster, kastes feilen:
ValueError: Expected singleton
Enklere sagt:
Odoo ventet én post. Den mottok flere.
Denne feilen dukker ofte opp i:
- Serverlogger
- Egendefinerte modulmetoder
- Beregnete felter
- Knappehandlinger
- Automatiserte handlinger
- Massoppdateringer
Forståelse av recordset-oppførsel er nøkkelen til å rette det riktig.
Hvorfor oppstår denne feilen
1. Feil forståelse av recordsets
I Odoo vil self nesten alltid være et recordset.
Selv om du tror du jobber med én post, kan metodene bli kalt for flere poster under operasjoner som:
- Batch-operasjoner i listevisninger
- Automatiserte arbeidsflyter
- Serveraksjoner
- API-importer
Kode som antar én post vil derfor kunne feile i slike sammenhenger.
2. Manglende løkke i metoden
Problemstilling: Enkel kode som antar enkeltpost kan bli tvetydig når recordset inneholder flere poster.
Eksempel på kode som skaper problemer:
Hvis self inneholder flere poster oppstår det uklarhet og potensielt feil.
Riktig tilnærming:
Iterer over hver post og oppdater feltet per rad — det gjør koden trygg i batch-situasjoner.
3. Feil bruk av ensure_one()
Odoo tilbyr en hjelpefunksjon for streng kontroll:
self.ensure_one()
Den tvinger metoden til å kreve nøyaktig én post. Dersom flere poster finnes, kastes Expected Singleton med vilje.
Bruk ensure_one() bare når forretningsreglene krever ett enkelt objekt (for eksempel ved åpning av en formeny).
4. Søk som returnerer flere poster
Typisk scenarie: Søk i modellen kan gi mer enn én treff, og etterfølgende logikk forventer én.
Eksempel på søk som kan gi flere resultater:
Hvis flere treff finnes for samme navn, vil senere kode som antar én post feile.
Sikrere alternativ:
Bruk limit=1 når du virkelig bare trenger ett objekt fra et søk.
5. Relasjonsfelt som skaper tvetydighet
Feil oppstår ofte i sammenhenger med Many2one eller One2many.
Typisk scenarie: Søk i modellen kan gi mer enn én treff, og etterfølgende logikk forventer én.
Eksempel på problematisk uttrykk når relasjonen inneholder flere rader:
Hvis order_line inneholder flere linjer blir uttrykket tvetydig og kan utløse feilen.
Slik fikser du Expected Singleton-feilen
Steg 1 – Iterer over recordsets
Grunnregel i Odoo:
Anta at self kan inneholde flere poster og skriv koden deretter.
Forhåndsregel: bruk løkker og behandl hver post separat der det er naturlig.
Steg 2 – Bruk limit=1 når det er riktig
Der hvor kun ett objekt gir mening i forretningssammenheng:
Hent ett resultat eksplisitt med limit=1 for å unngå flertallsresultater.
Steg 3 – Valider relasjonsfelt
Sjekk nøye følgende elementer:
- Many2one-relasjoner
- One2many-samlinger
- Domain-filtre
Sørg for at du ikke utilsiktet arbeider med flere rader der du trodde det var én.
Steg 4 – Gjennomgå API- og importprosesser
I miljøer med mye integrasjon kan batch-operasjoner ofte utløse denne feilen fordi flere poster behandles samtidig.
Hvis Odoo synkroniserer data fra eksterne systemer, sørg for at logikken tåler behandling i batch.
Hvordan unngå denne feilen i fremtidig Odoo-utvikling
- Unngå å anta enkeltpost-kontekst
- Test metoder med flere valgte poster
- Bruk løkker som standard
- Legg til limit=1 med vilje
- Hold relasjoner og datastruktur ryddige
I komplekse integrasjoner dukker slike feil ofte opp under automatiske importkjøringer eller planlagte jobber. Utvikle metoder som tåler flere rader samtidig for å sikre stabil drift.
Slik håndterer Dasolo recordset- og ORM-feil
Expected Singleton er sjelden bare en småfeil i koden. I velstrukturert Odoo-utvikling peker den ofte på dypere antakelser om recordset-behandling, ORM-bruk og datakonsistens.
I Dasolo tar vi ORM-feil på alvor ved å analysere hvordan recordsets behandles gjennom hele modulens livssyklus. Singleton-feil oppstår typisk når forretningslogikk er skrevet for enkeltposter, men kjøres på flertall — særlig i automatiske prosesser, integrasjoner og beregnede felter.
For å unngå gjentakende singleton-feil fokuserer vi på:
- Konsistente mønstre for iterasjon over recordsets
- Bevisst og sikker bruk av ensure_one()
- Forutsigbare og tydelige domain-filtre
- Ryddig struktur for relasjonsfelt
- Kontrollerte utløserpunkter for automatisering
Ved å designe ORM-logikk med skalerbarhet og batch-sikkerhet i tankene reduseres overraskende runtime-feil i produksjon betraktelig.
Oppsummering
Odoo-feilen Expected Singleton er en vanlig ORM-unntak som oppstår når koden prøver å behandle flere poster mens den forventer én. Selv om det ofte virker som en enkel utviklerglipp, kan det avdekke svakheter i hvordan recordsets håndteres i tilpassede moduler eller automatiserte prosesser.
Ved å forstå hvordan Odoo håndterer recordsets og ved å bruke sikre iterasjonsmønstre kan utviklere redusere forekomsten av denne feilen. Klare valideringer, forutsigbar filtrering og kontrollert automatisering er sentralt for stabile Odoo-løsninger.
Når singleton-feil håndteres riktig blir de nyttige varselsignaler som hjelper deg å styrke kodekvaliteten og øke systemets pålitelighet over tid.
Ofte stilte spørsmål
Nei. Den finnes i Odoo 14, 15, 16 og 17.
Nei. Det er en logisk feil i hvordan poster behandles.
Nei. Kun når forretningslogikken uttrykkelig krever at metoden kjøres på én post.