Skip to Content

Many2One-felt i Odoo — Den komplette guiden

En praktisk innføringsguide til Many2one-feltet i Odoos datamodell: fra grunnleggende bruk til relasjonslogikk og tekniske tilpasninger
6. mars 2026 etter
Many2One-felt i Odoo — Den komplette guiden
Dasolo
| No comments yet

Innledning


Many2One-feltet er en kjernekomponent i Odoos datamodell. Når du knytter en salgsordre til en kunde, setter et produkt i en kategori eller kobler en oppgave til et prosjekt, brukes denne typen relasjon. For å bygge stabile løsninger i Odoo—enten du konfigurerer med Studio eller utvikler moduler—er forståelsen av Many2One nødvendig.


Fra et virksomhetsperspektiv er Many2One-feltene det som binder moduler sammen. Uten dem blir hvert modulområde en frittstående øy; med dem flyter informasjonen sømløst mellom dokumenter, og brukere kan hoppe mellom relaterte poster uten å måtte tenke på hvordan databasen er strukturert.


Denne veilederen forklarer hva Many2One lagrer, hvordan feltet oppfører seg i Odoo ORM og i brukergrensesnittet, hvordan du oppretter og konfigurerer det via Odoo Studio eller Python, og viser praktiske bruksområder innen CRM, salg, lager og regnskap.

Hva er Many2One-feltet i Odoo


I ORM-en oppretter et Many2One-felt en pekepinne fra én post til nøyaktig én post i en annen modell. Navnet beskriver relasjonen sett fra den aktuelle modellen: mange poster her kan peke til én post der. Eksempler inkluderer at mange salgsordrer kan peke til én kunde, eller at mange produkter kan tilhøre én produktkategori.


På databasenivå lagrer Many2One et fremmednøkkelfelt i den aktive tabellen. Hvis en salgsordre refererer til kunde med ID 42, vil kolonnen partner_id på sale_order-tabellen inneholde tallet 42. Odoo tar seg av join-operasjonen og henter det menneskevennlige navnet automatisk.


I brukergrensesnittet vises Many2One som en rullegardin eller typeahead-søk. Brukeren begynner å skrive, og Odoo filtrerer treff i sanntid. Valgt post vises med navn, ikke intern ID, noe som gjør dette feltet intuitivt og brukervennlig.

Slik ser en feltdefinisjon ut i Python-modellen:


from odoo import fields, models

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    x_account_manager_id = fields.Many2one(
        comodel_name='res.users',
        string='Account Manager',
        ondelete='set null',
    )

Parametrene som styrer relasjonen er viktige: comodel_name angir hvilken modell som lenkes til, og ondelete bestemmer hva som skjer hvis den lenkede posten slettes. Typiske valg er cascade, set null eller restrict, hver med egne konsekvenser for dataintegriteten.


I Odoo Studio finner du Many2One under feltvelgeren merket Many2One. Når du legger det til via Studio velger du målm edellen fra en liste, og Studio oppretter feltet for deg—enkelt og uten kode, noe som gjør relasjonsoppsett tilgjengelig også for ikke-utviklere.

Slik fungerer feltet


Når du leser et Many2One-felt i ORM-en, får du et recordset som inneholder den lenkede posten. Er feltet tomt, får du et tomt recordset. I Python kan du derfor navigere direkte til relaterte felter med punktnotasjon.


order = self.env['sale.order'].browse(1)
customer_name = order.partner_id.name
customer_city = order.partner_id.city

Denne kjedede tilgangen sparer deg for eksplisitte joins eller separate queries—ORM-en skjuler databasearbeidet og gir lesbar og direkte Python-tilgang til relaterte data.

Når du kommuniserer med Odoo via XML-RPC, returnerer Many2One vanligvis en liste med to elementer: ID og visningsnavn, for eksempel [42, "Acme Corp"]. Et tomt felt returnerer False, noe som er viktig å ta hensyn til i automatiseringer og integrasjoner.


Viktige feltattributter

Her er de viktigste egenskapene du kan konfigurere på et Many2One-felt i Odoo:

  • comodel_name: Den tekniske modellen du lenker til. Dette er påkrevd.
  • ondelete: Styrer hva som skjer når den lenkede posten slettes. Valgene er 'cascade', 'set null' og 'restrict'. Standard er vanligvis 'set null'.
  • domain: Et filter som begrenser hvilke poster som kan velges i dropdownen, for eksempel domain=[('customer_rank','> ',0)] for kun kunder.
  • context: Ekstra kontekst som sendes når man åpner relasjonen eller oppretter ny lenket post—nyttig for forhåndsutfylling.
  • required: Gjør feltet obligatorisk; posten kan ikke lagres uten en verdi.
  • readonly: Hindrer brukere i å endre lenken manuelt, nyttig når verdien settes automatisk.
  • delegate: Hvis satt til True eksponeres relasjonens felt direkte på gjeldende modell—brukes ved modell-arv, ikke vanlig relasjonshåndtering.

Hvordan det vises i visninger

I skjema-visninger rendres Many2One som en søkbar dropdown hvor brukeren kan taste for å filtrere. En pil ved siden av feltet lar deg åpne den lenkede posten direkte, noe som gjør navigasjon mellom relaterte dokumenter raskt og flytende.


I listevisninger viser Many2One navnet på den lenkede posten og kan brukes til gruppering: for eksempel gruppere salgsordrer etter kunde eller oppgaver etter prosjekt—en vanlig funksjon i rapportering.


I søkefiltre kan Many2One benyttes som kriterium eller gruppering. Når du filtrerer CRM-pipelinen etter kunde, jobber du egentlig mot et Many2One-felt.


Det motsatte: One2Many

Hver Many2One har en naturlig motside: One2Many. Hvis salgsordrer peker til en kunde via Many2One, kan kundeposten vise alle tilknyttede ordrer gjennom et One2Many-felt. Dette feltet legger ikke til en ny databasekolonne—det kalkuleres fra Many2One på motsatt side—men gjør navigasjon mellom poster langt enklere for brukerne.

Forretningsscenarier


Many2One-feltet finnes overalt i et standard Odoo-oppsett. Nedenfor er fem konkrete eksempler fra virkelige arbeidsprosesser.


CRM: Knytte leads til selgere

I CRM-modulen peker hvert lead eller mulighet gjerne på en ansvarlig bruker via user_id (en Many2One mot res.users). Dette gjør det mulig å filtrere pipeline etter selger, analysere konverteringsgrad per person og tildele leads i bulk—uten egenutvikling. Trenger du en sekundær ansvarligperson, legger du enkelt til et ekstra Many2One-felt mot samme modell.


Salg: Koble ordre til kunder og prislist er

En salgsordre har som regel flere Many2One-felt, slik som partner_id (kunde) og pricelist_id (prislist e). Når en selger velger kunde, kan Odoo fylle inn prislisten, betalingsbetingelser og leveringsadresse automatisk via onchange-metoder som leser Many2One-verdien—en praktisk effekt av en ren datamodell.


Lager: Produkter og kategorier

Hvert produkt har en Many2One mot produktkategori (categ_idproduct.template). Kategori styrer blant annet regnskapskontoer, vurderingsmetode og lagerstrategi. Riktig kategori på produktnivå er avgjørende for korrekt finansiell rapportering—Many2One gjør denne tildelingen enkel og sentralisert.


Regnskap: Bilagslinjer og journaler

Hver regnskapsføring er knyttet til en journal via Many2One (journal_idaccount.move). Journalen bestemmer nummerserie, type bilag og ofte standardkontoer. Feil journalvalg kan føre til at posteringer ender i feil del av regnskapet, så Many2One fungerer her både som brukervenlighet og kontrollpunkt.


Prosjektstyring: Oppgaver og prosjekter

I prosjektmodulen tilhører hver oppgave et prosjekt via Many2One (project_idproject.task). Denne koblingen avgjør hvilke faser oppgaven bruker, hvilke team som har tilgang, og hvordan timeregistrering kobles til fakturering—helt sentralt for konsulentselskaper og timebasert fakturering.

Opprette eller tilpasse Many2One-feltet


Tre måter å legge til Many2One på


Avhengig av teknisk kontekst finnes det hovedsakelig tre tilnærminger for å legge til et Many2One-felt i en modell.

Bruke Odoo Studio (uten kode)

  1. Odoo Studio er verktøyet for lavkode-tilpasning. For å legge til Many2One uten å skrive kode gjør du slik:
  2. Åpne Studio fra hovedmenyen.
  3. Gå til skjemaet hvor feltet skal plasseres.
  4. Dra et Many2One-felt fra feltvelgeren og slipp det på skjemaet.
  5. I egenskapsvinduet velger du målmodell og eventuelle domain-filtre.
  6. Sett etikett og lagre endringene.

Studio oppretter feltet med et x_studio_-prefiks og legger det inn i visningen. Feltet blir umiddelbart tilgjengelig for brukere—en rask og trygg måte å bygge relasjoner uten utviklingserfaring.


Bruke Python i et tilpasset modul

For utviklere defineres Many2One direkte i Python-kode—anbefalt for produksjonsmoduler som skal versjonsstyres og deployeres til flere miljøer.


from odoo import fields, models

class ProjectTask(models.Model):
    _inherit = 'project.task'

    x_client_contact_id = fields.Many2one(
        comodel_name='res.partner',
        string='Client Contact',
        domain=[('type', '=', 'contact')],
        ondelete='set null',
        help='The main contact at the client for this task.',
    )

Etter modellendringen må feltet legges inn i riktig view-XML og modul oppgraderes for å få databaseendringene på plass. Denne tilnærmingen gir full kontroll over domain, ondelete, beregnede felt og valideringer—standard prosess i profesjonell Odoo-utvikling.


Lag alltid motsatt One2Many når det gir mening


class ResPartner(models.Model):
    _inherit = 'res.partner'

    x_task_ids = fields.One2many(
        comodel_name='project.task',
        inverse_name='x_client_contact_id',
        string='Related Tasks',
    )

Bruke XML-RPC API

Ved fjernstyrte endringer eller automatiserte deploy-skript kan du opprette Many2One-felt via XML-RPC, nyttig for massekonfigurasjoner eller når endringer må kjøres uten direkte moduloppdatering.


field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_client_segment_id',
        'field_description': 'Client Segment',
        'model_id': model_id,
        'ttype': 'many2one',
        'relation': 'res.partner.category',
        'on_delete': 'set null',
        'state': 'manual',
    }]
)

Nøkkelparametere ved API-opprettelse inkluderer relation som målmodell og on_delete for sleteadferd. Når du lager felt programmatisk, husk også å opprette One2Many på motsatt modell slik navigasjonen fungerer begge veier—en vanlig regel i fjernkonfigurasjoner.

Beste praksis


1. Opprett alltid motsatt One2Many

Når du legger til Many2One, opprett samtidig den inverse One2Many på målmodellen. Dette koster ikke ekstra datalagring, men gir brukerne en naturlig navigasjonsvei fra målpunktene tilbake til alle tilknyttede poster.


2. Bruk domain-filtre for å begrense utvalget

Som standard viser Many2One alle poster i målmodellen. Hvis feltet kun skal velge kunder, bruk domain som domain=[('customer_rank','>',0)] for å redusere støy og hindre gale valg som gir feil videre i arbeidsflyten.


3. Velg ondelete med omhu

ondelete-innstillingen kan ha store konsekvenser. 'cascade' vil slette tilknyttede poster når målposten fjernes—noe som i verste fall kan føre til utilsiktet tap av store datamengder. Ofte er 'set null' tryggest; bruk 'restrict' når en målpåte ikke må fjernes så lenge det finnes referanser.


4. Ikke dupliser data som hører hjemme i en Many2One

Unngå å legge inn tekstfelt for data som allerede finnes som poster i en annen modell. Å lagre navn i en char-kolonne i stedet for å peke til en partner med Many2One fører til duplikater, vanskelig filtrering og brudd når navn endres. Er verdiene allerede modellerte poster—bruk Many2One.


5. Bruk context for forhåndsutfylling

Context-parameteren kan sende standardverdier når brukeren oppretter en ny lenket post fra dropdownen. For eksempel kan du forhåndsutfylle prosjektet på en ny kontakt som opprettes fra en oppgave—det sparer tid og sikrer konsistens.

Vanlige fallgruver


Glemme motsatt One2Many

Den vanligste tabben er å legge til Many2One uten å lage inverse One2Many. Konsekvensen er enveiskommunikasjon: du ser lenken fra den ene siden, men det finnes ingen oversikt fra målpunkten over hva som peker til den. Brukere må så lage egne søk eller rapporter for å finne relaterte poster—unødvendig arbeid som lett unngås.


Bruke cascade-sletting uten vurdering

Å sette ondelete='cascade' på relasjoner til masterdata kan skape katastrofe ved sletting eller arkivering. Hvis en kategori slettes og alle produkter i kategorien kaskadeslettes, kan det fjerne store mengder produktdata. Som regel er set null eller restrict bedre valg for forretningsdata.


Ikke sjekke for False i Python-navigasjon

Når et Many2One er tomt, gir det et falsy recordset i Python. Å gjøre kjeding uten kontroll (f.eks. order.partner_id.country_id.name) kan gi tomme strenger og føre til feil i rapporter eller e-poster som ikke lett oppdages. Sjekk alltid at mellomledd eksisterer hvis feltet ikke er obligatorisk.


Peke på feil modell

Modellen res.partner inneholder kunder, leverandører og kontakter. En Many2One mot res.partner uten domain åpner hele listen—interne brukere, leveringsadresser og leverandørkontakter vises. Hvis feltet skal være kunder, definer et domain som matcher intensjonen.


Overbruk av Many2One når Selection er nok

Hvis valgmulighetene er få og faste, er et Selection-felt ofte enklere og mer effektivt enn å lage en hel modell med Many2One. Many2One krever egne poster og medfører joins i spørringer. For et statusfelt med noen få verdier er Selection ofte det riktige valget.

Konklusjon


Many2One ligger i kjernen av hvordan Odoo knytter informasjon mellom moduler. Forståelsen er ikke bare relevant for utviklere—funksjonelle konsulenter, superbrukere og analytikere drar stor nytte av å vite når feltet skal brukes og hvilke konsekvenser det har.


Hovedpunktene å huske er: lag alltid den inverse One2Many for å sikre navigasjon i begge retninger, bruk domain for å holde dropdowns relevante, velg ondelete med omhu, og unnlat å bruke Many2One når et enklere Selection-felt dekker behovet.


Enten du konfigurerer via Odoo Studio, utvikler en modul i Python eller endrer strukturen via XML-RPC, vil riktige relasjonsfelt fra starten gjøre implementasjonen mer stabil og enklere å vedlikeholde over tid.

Hos Dasolo hjelper vi bedrifter med å implementere, tilpasse og optimalisere Odoo på tvers av avdelinger. Trenger du hjelp med datamodell, relasjonsfelt på skjemaer eller utvikling av fullverdige moduler, kan vårt team bistå. Ta kontakt med oss så tar vi en prat om ditt Odoo-prosjekt.

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