Skip to Content

One2many-felt i Odoo: Den komplette guiden

One2many-feltet i Odoo kobler én post til mange relaterte poster — tenk på det som en hovedmappe med flere undermapper. Bruk det når én enhet naturlig eier eller samler flere tilknyttede oppføringer, for eksempel en kunde med mange ordrelinjer eller et prosjekt med flere oppgaver. I datamodellen opprettes One2many fra eiersiden som en beregnet liste som peker til en Many2one på den andre siden. Praktisk implementasjon innebærer å definere en Many2one i den «mange»-modellen (f.eks. order_line med felttype Many2one som peker til order), og deretter et One2many-felt i «én»-modellen som refererer tilbake ved hjelp av feltets navn på Many2one (f.eks. order_line_ids = fields.One2many('sale.order.line', 'order_id', ...)). Dette gir støtte for visning, redigering og automatisk filtrering av relaterte rader i Odoos grensesnitt og ORM-operasjoner.
6. mars 2026 etter
One2many-felt i Odoo: Den komplette guiden
Dasolo
| No comments yet

Introduksjon


Har du noen gang åpnet en salgsordre i Odoo og sett raden med ordrelinjer under kundedetaljene? Det du ser der er en One2many-relasjon i praksis — en grunnleggende byggestein i Odoo som lar én forelder ha mange underliggende poster. For både brukere og utviklere er det viktig å forstå denne mekanismen for å kunne modellere og navigere data riktig.


Denne veilederen gir en praktisk innføring i hva One2many-feltet er, hvordan det fungerer i Odoo sitt ORM, når du bør bruke det, og hvordan du kan opprette eller konfigurere det — enten via Odoo Studio uten kode eller ved å skrive Python i en modul.

Enten du er en forretningsbruker som ønsker oversikt over datastrukturen, eller en utvikler som trenger konkrete råd om feltoppbygging, finner du her det viktigste om One2many i Odoo.

Hva er One2many-feltet i Odoo


One2many er en relasjonstype i Odoo hvor én forelder kan være knyttet til flere barneposter i et annet modellobjekt. Den representerer altså naturlig én-til-mange-forhold i datamodellen.


Tenk på det slik: én kunde kan ha flere fakturaer, én salgsordre kan inneholde mange ordrelinjer, og ett prosjekt kan bestå av mange oppgaver. One2many gir forelderen en «utsikt» over alle disse tilknyttede barnepostene.


I brukergrensesnittet vises One2many ofte som en innebygd liste i et skjema. Den fungerer som et redigerbart bord der brukere kan legge til, endre eller fjerne underposter uten å forlate hovedskjemaet — noe som gjør den til et av de mest synlige og brukte mønstrene i Odoo.


Forskjellen mot andre relasjonstyper

I Odoos ORM finnes hovedsakelig tre relasjonstyper som dekker de vanligste behovene for koblinger mellom modeller.


  • Many2one: En post som peker til én post i en annen modell, for eksempel en salgsordre som peker til én kunde.
  • One2many: En post som er koblet til mange poster i en annen modell, for eksempel en salgsordre med mange ordrelinjer.
  • Many2many: Flere poster på begge sider som kan knytte seg til hverandre, som produkter og merkelapper der begge sider kan ha flere koblinger.

Velg One2many når hver barnepost tilhører akkurat én forelder. Hvis samme barnepost skal kunne deles mellom flere foreldre, er Many2many riktig løsning — ellers oppstår duplikater og dataintegritetsproblemer.


En spesiell egenskap ved One2many er at feltet i seg selv ikke lagrer kolonner på foreldretabellen. Det er en virtuell relasjon som leser barneposter basert på en Many2one på barnet.

Slik fungerer feltet


I databasen finnes ingen egen kolonne for One2many på foreldremodellen. All referanseinformasjon ligger i child-tabellen, hvor hver rad har en fremmednøkkel som peker til forelderen.


Dette betyr at hver One2many er avhengig av en eksisterende Many2one på den relaterte modellen. One2many fungerer i praksis som et omvendt oppslag: Odoo finner alle barneposter hvor child.many2one == parent.id.


Sammenhengen mellom One2many og Many2one

Når du definerer en One2many i Python, må du oppgi to sentrale egenskaper som binder relasjonen sammen.


  • comodel_name: navnet på modellen som inneholder barnepostene.
  • inverse_name: navnet på Many2one-feltet på barneområdet som peker tilbake mot forelderen.

Et konkret oppsett viser hvordan for eksempel en Service-kontrakt kan være koblet til flere leveranser (deliverables) via One2many.


Eksemplet i kode illustrerer feltnavn og parameterbruk — hvordan parent.deliverable_ids refererer til service.deliverable-modellen gjennom inverse feltet contract_id.

I praksis må contract_id være definert som Many2one på service.deliverable først; uten denne inverse-feltdefinisjonen kan ikke One2many-relasjonen eksistere.


Hva som skjer i databasen

I databasen lagres ikke One2many-data på foreldretabellen. All relasjonsinformasjon ligger i child-tabellen hvor hver barnepost har en fremmednøkkel kolonne som peker på parent.id.

Når Odoo viser foreldreskjemaet, utføres en spørring mot barne-tabellen: hent alle rader hvor foreign_key == current_parent_id. Dette håndteres av ORM-en og følger vanlig relasjonsdatabase-logikk.


Derfor regnes One2many som et felt i Python-laget som ikke legger til kolonner i databasen — det er en beregnet visning av relaterte poster.

Typiske forretningsscenarier


One2many brukes i mange moduler fordi det naturlig modellerer forelder–barn-forhold. Nedenfor finner du fem konkrete bruksområder fra daglig forretningsbruk.


1. Salgsordre og ordrelinjer

I salgsmodulen binder feltet order_line_ids på sale.order til sale.order.line. Hver linje inneholder produkt, mengde, pris og rabatt, og brukeren kan administrere linjer direkte fra ordreskjemaet uten å bytte vindu.


2. Fakturaer og fakturalinjer

Innen regnskap bruker account.move en One2many for å holde fakturalinjer (account.move.line). Hver linje representerer en kostnad eller inntektspost som regnes med i fakturaens totale beløp.


3. Prosjekter og oppgaver

Prosjektmodulen viser oppgaver som hører til et prosjekt via One2many på project.project. I skjemaet kan disse vises som liste, kanban eller Gantt — alle basert på samme relasjon.


4. Kontakter og underkontakter

res.partner har child_ids som viser personer eller avdelingskontakter tilknyttet et firma. Hver underkontakt har en Many2one parent_id tilbake til selskapet.


5. Egendefinerte modeller i tjeneste- eller produksjonsprosesser

Når du bygger egne moduler, er One2many naturlig for tilfeller der én enhet eier en liste over underenheter — for eksempel en vedlikeholdsordre med flere deler, et kurs med flere kursdager, eller en kontrakt med flere leveranser.


Denne fleksibiliteten forklarer hvorfor One2many er sentral i tilpasning og modellbygging i Odoo.

Opprette eller tilpasse feltet


Det finnes to vanlige måter å opprette en One2many-relasjon på: via Odoo Studio for en no-code-løsning, eller ved å definere feltet i Python i en modul for full kontroll.


Bruke Odoo Studio

I Studio kan du ikke opprette One2many direkte fra parent-malen uten at Many2one først finnes på child-modellen — fordi One2many alltid speiler en inverse Many2one.

Anbefalt fremgangsmåte i Studio er derfor å starte på barne-modellen og legge til Many2one som peker til forelderen.

  1. Legg først til Many2one-feltet på child-modellen i Studio, pek det mot parent-modellen.
  2. Etter lagring går du tilbake til foreldremodellen i Studio.
  3. Derfra legger du til et nytt felt av typen One2many, og Studio vil be deg velge relatert modell og inverse-feltet du nettopp opprettet.
  4. Resultatet blir en innebygd liste i foreldreskjemaet som oppfører seg som et vanlig One2many-felt.

For mange forretningsbrukere er dette den enkleste måten å få One2many-funksjonalitet uten å skrive kode — feltene opprettet i Studio oppfører seg likt de som er definert i Python.


Bruke Python i en tilpasset modul

Utviklere foretrekker ofte å definere One2many i Python for presis kontroll over navn, domener, og annen logikk. Under følger et komplett struktureksempel som viser både parent- og child-modellene.


Koden viser nødvendige imports og feltdefinisjoner: en parent-modell med deliverable_ids som One2many og en child-modell med contract_id som Many2one og beskrivelsesfeltet.

Legg merke til at Many2one (contract_id) må være definert på child-modellen først, og at inverse_name i One2many må samsvare eksakt med dette feltets navn.


Opprette felt via XML-RPC API

Hvis du administrerer felt programmatisk, kan du opprette One2many-felt gjennom XML-RPC ved å manipulere ir.model.fields. Reglene er de samme: opprett først Many2one, så definer One2many med relation_field som peker på Many2one-navnet.


Denne metoden er nyttig for automatisering eller når du trenger å synkronisere felt over flere miljøer.

Gode fremgangsmåter


Basert på praktisk erfaring fra Odoo-prosjekter er det noen fremgangsmåter som reduserer problemer og gjør vedlikehold enklere når du arbeider med One2many.


  • Alltid opprett Many2one først. Uten inverse-feltet vil ikke One2many la seg definere, enten du bruker Studio, Python eller API.
  • Bruk _ids-suffikset for feltnavn. I Odoo-konvensjonen gir det umiddelbar indikasjon på at feltet returnerer et sett med poster, for eksempel line_ids eller task_ids.
  • Sett ondelete='cascade' når det gir mening. Hvis child-postene skal slettes når forelderen fjernes, hindre du at foreldreløse rader ligger igjen i databasen.
  • Hold den innebygde listen fokusert. Vis bare de viktigste kolonnene for å unngå at skjemaet blir tungt eller uoversiktlig — sekundære kolonner kan settes som valgfrie (optional).
  • Bruk domain-filtre for å begrense hvilke barneposter som vises. Dette er nyttig når en og samme child-modell brukes av flere ulike foreldre.
  • Vær forsiktig med store datamengder. Hvis en forelder kan ha tusenvis av barn, bør du unngå å laste dem alle inne i skjemaet — vurder separat listevisning eller paginering.

Vanlige fallgruver


De vanligste feilene folk gjør med One2many i Odoo omfatter både design- og implementasjonsfeil som lett kan unngås.


Glemme inverse Many2one

Den vanligste feilen er å forsøke å definere One2many uten at inverse Many2one eksisterer. Odoo vil gi feilmelding — sjekk alltid at inverse_name faktisk finnes på barne-modellen før du fortsetter.


Feil skrivemåte ved oppdatering

Når du oppdaterer One2many fra kode eller API, må du bruke Odoo sitt kommando-tuple-format. Du kan ikke sette feltet til en vanlig Python-liste direkte.


  • (0, 0, values_dict) oppretter en ny barnepost.
  • (1, child_id, values_dict) oppdaterer en eksisterende barnepost.
  • (2, child_id, 0) sletter en eksisterende barnepost.
  • (4, child_id, 0) legger til en eksisterende barnepost i relasjonen.
  • (5, 0, 0) fjerner alle relasjoner uten å slette barnepostene.

Forsøk på å skrive direkte som record.line_ids = [1, 2, 3] vil ikke gi ønsket resultat i ORM-en.


Forveksle One2many med Many2many

Husk at One2many betyr eksklusivt eierskap: hver barnepost tilhører én forelder. Hvis du trenger at samme post er knyttet til flere foreldre, bruk Many2many for å unngå duplikater og brutt dataintegritet.


Ytelsesproblemer med store underlister

Hundrevis eller tusenvis av linjer i et embedded One2many kan gjøre skjemaet tregt. Dette er vanlig i regnskap og lagerstyring. Bruk limit på visningen eller send brukeren til en separat liste for større datamengder.


Foreldreløse poster etter sletting

Dersom du sletter en forelder uten å bruke ondelete='cascade' på child-ens Many2one, kan barnepostene bli igjen med ugyldig eller null referanse. Over tid fører dette til rot i databasen og rare feil i visninger og rapporter.

Oppsummering


One2many er en kjernekomponent i Odoos datamodell som driver mange sentrale funksjoner — fra ordrelinjer til fakturalinjer og prosjektoppgaver. Forståelsen av hvordan den knyttes til Many2one gjør det mye enklere å lese og utvide systemet.


Uansett om du konfigurerer Odoo, bruker Studio, eller utvikler moduler fra bunnen av, vil One2many være et verktøy du ofte tar i bruk. Riktig bruk og god praksis sparer tid og forebygger dataproblemer.

Vil du lære mer? Se flere guider og tekniske artikler i samlingen om Odoo Data & API for dypere innsikt.

Trenger du hjelp med din Odoo-implementering?


Dasolo hjelper bedrifter med å implementere, skreddersy og optimalisere Odoo etter deres behov. Enten du trenger hjelp med datamodellering, utvikling av moduler, opprettelse av felt eller å få mer verdi ut av løsningen, står vårt team klart til å bistå.

Har du spørsmål om ditt Odoo-prosjekt eller ønsker å diskutere hvordan data bør struktureres i systemet, ta kontakt med oss— vi hjelper deg gjerne.

One2many-felt i Odoo: Den komplette guiden
Dasolo 6. mars 2026
Share this post
Logg inn to leave a comment