Skip to Content

Referansefelt i Odoo: Den Ultimative Guiden

En praktisk guide til Odoo Referansefeltet: hvordan det kobler poster på tvers av flere modeller, når det skal brukes, og hvordan man implementerer det med Studio eller Python
6. mars 2026 etter
Referansefelt i Odoo: Den Ultimative Guiden
Dasolo
| No comments yet

Introduksjon


De fleste Odoo-utviklere velger Many2one-feltet når de trenger å knytte en post til en annen. Det fungerer perfekt i de aller fleste tilfeller. Men noen ganger støter du på en situasjon der det tilknyttede dokumentet kan være en av flere forskjellige ting: en salgsordre, en innkjøpsordre, en produksjonsordre, eller noe helt annet avhengig av konteksten. Det er akkurat det referansefeltet er bygget for.


Referansefeltet er en av de mer fleksible felttypene i Odoo ORM. Det lar deg opprette en lenke til en post fra hvilken som helst modell i en forhåndsdefinert liste, i stedet for alltid å peke på den samme modellen. Brukeren velger først dokumenttypen, deretter velger han den spesifikke posten. Resultatet er en polymorf lenke som kan tilpasse seg forskjellige arbeidsflyter.


Denne guiden dekker hva referansefeltet lagrer, hvordan det oppfører seg i Odoo-datamodellen, hvordan du kan opprette og tilpasse det ved hjelp av Odoo Studio eller Python, og praktiske forretningsbrukstilfeller der det virkelig tilfører verdi.

Hva er Referansefeltet i Odoo


I Odoo ORM er Referansefeltet en spesiell felttype som lagrer en lenke til en post fra hvilken som helst modell du inkluderer i sin selection-liste. Dette gjør det fundamentalt forskjellig fra et Many2one-felt, som alltid peker på én fast modell.


I databasen lagrer Referansefeltet verdien sin som en vanlig tekststreng i formatet model_name,record_id. For eksempel ville en referanse til salgsordre nummer 42 bli lagret som sale.order,42. Dette er viktig å forstå hvis du noen gang trenger å spørre eller filtrere disse postene direkte.


Fra brukergrensesnittets perspektiv fremstår et Referansefelt som en to-trinns inndata. Brukeren velger først en dokumenttype fra en nedtrekksliste (for eksempel: Salgsordre, Faktura eller Prosjektoppgave), og deretter velger den spesifikke posten fra den modellen ved hjelp av et søkefelt. Grensesnittet er rent og enkelt når brukerne forstår den to-trinns utvelgelsen.


Her er hva en grunnleggende definisjon av et Referansefelt ser ut i Python:

from odoo import fields, models

class HelpDeskTicket(models.Model):
    _inherit = 'helpdesk.ticket'

    related_document = fields.Reference(
        selection=[
            ('sale.order', 'Salgsordre'),
            ('purchase.order', 'Innkjøpsordre'),
            ('account.move', 'Faktura'),
            ('project.task', 'Prosjektoppgave'),
        ],
        string='Relatert Dokument',
    )

selection-parameteren er en liste med tupler. Hver tuple inneholder det tekniske modellenavnet (som sale.order) og den menneskelig lesbare etiketten som brukerne vil se i nedtrekkslisten. Du kontrollerer nøyaktig hvilke modeller som er tilgjengelige i denne listen.


Det finnes også en dynamisk variant der utvalgsliste fylles fra ir.model-tabellen ved kjøretid, noe som gjør alle installerte modeller tilgjengelige. Dette er nyttig for svært konfigurerbare verktøy, men kan bli overveldende for sluttbrukere hvis det ikke filtreres riktig.


I Odoo Studio er Referansefeltet tilgjengelig under panelet for felttyper og merket Referanse. Når du legger det til gjennom Studio, kan du konfigurere listen over valgbare modeller direkte fra grensesnittet uten å skrive noe kode. Dette gjør det til et av de mer tilgjengelige alternativene blant de avanserte Odoo studio-feltene.

Hvordan feltet fungerer


Å forstå hvordan Referansefeltet lagrer og henter data er nøkkelen til å bruke det riktig i Odoo-utviklingsprosjektene dine.


Lagring i databasen

I motsetning til et Many2one-felt, som bare lagrer et heltall (den fremmednøkkelen), lagrer Referansefeltet en strengverdi som inkluderer både modellenavnet og post-ID-en. For eksempel: sale.order,15. Dette lagres i en VARCHAR-kolonne i PostgreSQL. Det betyr at databasen ikke håndhever noen fremmednøkkelbegrensning på denne kolonnen, noe som er et bevisst designvalg for å støtte den polymorfe naturen til feltet.


Fordi det ikke finnes noen fremmednøkkel på databasenivå, rydder ikke Odoo automatisk opp i verdiene i Referansefeltet når den tilknyttede posten blir slettet. Hvis en salgsordre blir slettet, vil et Referansefelt som peker til den fortsatt inneholde den gamle strengverdien. Dette er en av de viktigste atferdsforskjellene å huske på under Odoo-utvikling.


Tilgang til den koblede posten i Python

Når du leser en referansefeltverdi i Python, returnerer Odoo det faktiske postobjektet til den refererte modellen. Du kan få tilgang til feltene direkte, akkurat som du ville gjort med et Many2one-resultat. Hvis feltet er tomt, returnerer det False.


ticket = self.env['helpdesk.ticket'].browse(1)
doc = ticket.related_document

if doc:
    print(doc._name)   # f.eks. 'sale.order'
    print(doc.name)    # f.eks. 'S00042'
    print(doc.id)      # f.eks. 15

Dette er en av de praktiske aspektene ved Odoo ORM-abstraksjonen. Selv om den underliggende lagringen er en vanlig tekststreng, løser rammeverket det til et riktig postobjekt når du får tilgang til det i koden.


Nøkkelfeltattributter

Dette er de mest relevante attributtene du kan konfigurere på et referansefelt i Odoo-rammeverket:


  • selection: En liste med tupler som definerer hvilke modeller som kan velges. Kan også være et metodenavn (streng) som dynamisk returnerer en slik liste.
  • string: Feltetiketten som vises for brukerne i grensesnittet.
  • required: Gjør feltet obligatorisk. Brukeren må velge både en modelltype og en post før lagring.
  • readonly: Forhindrer brukere fra å endre feltverdien fra grensesnittet. Nyttig når referansen settes programmatisk.
  • help: Et verktøytips som vises når brukeren holder musen over feltetiketten. Nyttig for å veilede brukere om hva de skal velge.
  • compute: Som enhver annen Odoo-felttype kan et referansefelt beregnes dynamisk ved hjelp av en Python-metode. Dette er nyttig for automatisk å sette en referanse basert på forretningslogikk.

Filtrering og Søk

Fordi verdien lagres som en vanlig streng, krever filtrering på et Referansefelt spesifikk domene-syntaks. For å søke etter poster knyttet til et spesifikt dokument, må du komponere strengverdien selv:


tickets = self.env['helpdesk.ticket'].search([
    ('related_document', '=', 'sale.order,15')
])

Du kan også filtrere etter modelltype ved å bruke en like operator:


tickets = self.env['helpdesk.ticket'].search([
    ('related_document', 'like', 'sale.order,')
])

Husk denne strengbaserte filtreringsadferden når du designer rapporter eller beregnede felt som avhenger av verdier fra Referansefelt. Det oppfører seg annerledes enn et typisk Many2one domene-filter.

Forretningsbrukstilfeller


Referansefeltet er mest verdifullt i situasjoner der den samme typen kontekstlenke kan peke på dokumenter av forskjellige typer avhengig av situasjonen. Her er fem praktiske eksempler fra virkelige forretningsarbeidsflyter.


1. Helpdesk-billetter knyttet til ethvert dokument

Et supportteam håndterer billetter som kan relatere til veldig forskjellige ting: en fakturakonflikt, et leveringsproblem, et kontraktspørsmål eller et defekt produkt. I stedet for å opprette et eget felt for hver dokumenttype, lar et enkelt Referansefelt på billettmodellen agenten knytte til hvilket som helst relevant dokument. Agenten velger typen først (Faktura, Salgsordre, Levering, osv.) og velger deretter den spesifikke posten. All kontekst er i ett felt.


2. CRM-aktiviteter knyttet til flere kildedokumenter

I et salgsteam oppstår aktiviteter og oppfølgingsoppgaver noen ganger fra forskjellige kilder: et lead, et tilbud, en eksisterende kontrakt eller en supportsak. Et Referansefelt på en tilpasset aktivitetsmodell eller CRM-notat lar selgere merke det opprinnelige dokumentet uten å være låst til en enkelt modell. Dette er en naturlig tilpasning for Referansefeltet i en Odoo CRM-tilpasning.


3. Notater og annotasjoner på tvers av moduler

Noen selskaper bygger en enkel intern notat- eller annotasjonsmodell for å loggføre observasjoner på tvers av forskjellige forretningsobjekter. Et Referansefelt lar en enkelt notatpost knyttes til en kundepost, en prosjektoppgave, en produksjonsordre eller en innkjøpsordre, alt innenfor samme felt. Dette unngår å duplisere notatmodellen for hver dokumenttype.


4. Dokumentgodkjenningsarbeidsflyt

Når man implementerer en generell godkjenningsarbeidsflyt, må godkjenningsforespørselen peke på dokumentet som godkjennes. Siden godkjenninger kan gjelde innkjøpsordrer, utgiftsrapporter, permisjonsforespørsel eller kontrakter, holder et Referansefelt på godkjenningsmodellen arkitekturen ren. Den samme godkjenningslogikken håndterer alle dokumenttyper uten behov for separate modeller for hver.


5. Utgiftsrapporter knyttet til prosjekter eller kundeordrer

I noen regnskapssystemer må en utgift knyttes til enten et kundeprosjekt eller en salgsordre avhengig av kostnadens art. Et Referansefelt med både project.project og sale.order i utvalgsliste gir regnskapsføreren fleksibilitet til å knytte utgiften til hvilket som helst dokument som gjelder. Dette er spesielt nyttig i profesjonelle tjenester og konsulentfirmaer som kjører Odoo.


Opprette eller tilpasse referansefeltet


Det er to hovedmåter å legge til et Referansefelt i en Odoo-modell: ved å bruke Odoo Studio for en kodefri tilnærming, eller ved å skrive det direkte i Python for full kontroll.


Bruke Odoo Studio

Odoo Studio gjør det enkelt å legge til et Referansefelt til ethvert skjema uten å berøre koden. Åpne Studio på modellen du ønsker å utvide, gå til Felt-panelet, og legg til et nytt felt av typen Referanse. Du vil bli bedt om å velge hvilke modeller som skal vises i nedtrekkslisten. Studio lagrer feltet som et manuelt felt med x_ prefiks, akkurat som andre Odoo studio-felt opprettet gjennom grensesnittet.


Denne tilnærmingen er ideell for raske tilpasninger og for forretningsanalytikere som ønsker å utvide skjemaer uten utviklerinvolvering. Husk at Studio-opprettede Referansefelt kan ha begrenset støtte for avanserte konfigurasjoner som dynamiske utvalgsmetoder eller beregnede verdier.


Teknisk implementering i Python

For en full Odoo utviklingstilnærming, definer Referansefeltet direkte i en Python-modell. Her er et mer komplett eksempel som viser hvordan man oppretter et Referansefelt med en dynamisk utvalgsmetode:

from odoo import api, fields, models

class ApprovalRequest(models.Model):
    _name = 'approval.request'
    _description = 'Approval Request'

    name = fields.Char(string='Request Name', required=True)

    @api.model
    def _get_document_types(self):
        return [
            ('purchase.order', 'Purchase Order'),
            ('hr.expense.sheet', 'Expense Report'),
            ('hr.leave', 'Time Off Request'),
            ('sale.order', 'Sale Order'),
        ]

    document_ref = fields.Reference(
        selection='_get_document_types',
        string='Document',
        help='Select the document this approval relates to.',
    )

Å bruke en metode for selection-parameteren (ved å sende navnet som en streng) gir deg mer fleksibilitet. Du kan legge til betinget logikk, filtrere basert på installerte moduler, eller bygge listen dynamisk fra konfigurasjonsopptegnelser.


Oppretting via XML-RPC API

Du kan også opprette et Referansefelt programmatisk ved hjelp av Odoo XML-RPC API. Dette er nyttig når du distribuerer felt som en del av en ekstern konfigurasjonsnotatbok. Felttypen som skal brukes er reference og utvalget sendes som en strengrepresentasjon av listen:


field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_related_document',
        'field_description': 'Relatert Dokument',
        'model_id': model_id,
        'ttype': 'reference',
        'selection': "[('sale.order', 'Salgsordre'), ('purchase.order', 'Innkjøpsordre')]",
        'state': 'manual',
    }]
)

Merk at når du oppretter et Referansefelt gjennom API-et, sendes selection-verdien som en Python-evaluerbar streng i stedet for en faktisk liste. Slik lagrer og leser Odoo det fra ir.model.fields-tabellen.

Beste praksis


Her er de mest nyttige retningslinjene å følge når du arbeider med Referansefelt i Odoo-datamodellen din.


  • Hold utvalglisten kort og meningsfull. Ikke inkluder hver modell bare fordi du kan. Begrens listen til dokumenttypene som virkelig gir mening for bruksområdet. En lang liste forvirrer brukerne og gjør feltet vanskeligere å bruke riktig.
  • Bruk Many2one når du alltid lenker til den samme modellen. Referansefeltet er designet for polymorfe relasjoner. Hvis den lenkede modellen aldri endres, er et standard Many2one-felt enklere, raskere å spørre om, og bedre støttet av Odoo-rapporteringsverktøy.
  • Kontroller alltid for nullverdier i beregnede felt. Når et Referansefelt er tomt, returnerer det False i Python. All kode som får tilgang til den lenkede posten må sjekke for dette først for å unngå feil.
  • Håndter foreldreløse referanser i automatiserte handlinger. Siden databasen ikke håndhever referensiell integritet på Referansefelt, er det en god idé å legge til en automatisert handling eller en planlagt handling som periodisk sjekker for og fjerner utdaterte referanser som peker til slettede poster.
  • Bruk beskrivende etiketter for hver modell i utvalget. Det andre elementet i hver tuple er hva brukerne ser i nedtrekksmenyen. Bruk klare, forretningsvennlige etiketter i stedet for tekniske modellenavn. Skriv "Kunde Faktura" i stedet for "account.move".
  • Dokumenter feltet tydelig i dine tekniske spesifikasjoner. Fordi Referansefelt oppfører seg annerledes enn standard Many2one-felt, vil enhver utvikler som arver koden din dra nytte av en klar forklaring på hvorfor en Referanse ble valgt og hvilke modeller den lenker til.

Vanlige fallgruver


Dette er feilene vi ser oftest når utviklere eller forretningsanalytikere jobber med Referansefelt for første gang.


Behandle det som en Many2one i Domene Filtre

Utviklere skriver noen ganger domene filtre for et Referansefelt ved å bruke samme syntaks som en Many2one, for eksempel [('document_ref', '=', 15)]. Dette vil ikke fungere. Den lagrede verdien er en streng som sale.order,15, ikke bare et heltall. Du må komponere den fullstendige strengverdien når du bygger domene filtre på et Referansefelt.


Glemme at Slettede Poster Etterlater Orphan Verdier

Fordi det ikke er noen utenlandsk nøkkelbegrensning i databasen, sletter det en referert post ikke verdien i Referansefeltet. Hvis en salgsordre slettes og en billett fortsatt har sale.order,42 i sitt Referansefelt, vil lesing av det feltet returnere False i stedet for å heve en feil. Kode som er avhengig av at referansen er gyldig, må alltid håndtere dette tilfellet.


Overbruk av den Dynamiske Alle-Modeller Valg

Odoo lar deg sende en metode for selection som returnerer alle installerte modeller fra ir.model. Selv om dette er kraftig, er det nesten alltid for bredt for et brukergrensesnittfelt. Å presentere hundrevis av modeller i en nedtrekksmeny er forvirrende og fører til feil datainntasting. Begrens alltid valget til en kuratert liste over meningsfulle dokumenttyper.


Forvente Nativ Gruppering i Rapporter

Referansefelt lagres som enkle tekststrenger i databasen. De er ikke utenlandske nøkler, så standard Odoo grupperings- og pivot-funksjonalitet fungerer ikke på dem slik den gjør på Many2one-felt. Hvis du trenger å gruppere eller aggregere poster etter deres tilknyttede dokument, må du håndtere dette gjennom tilpasset kode eller et beregnet felt som henter modellnavnet som et eget valg eller tekstfelt.


Forvirre Referanse og Many2one i Odoo Studio

Når du bruker Odoo Studio, blander noen brukere Referansefeltet og Many2one-feltet fordi begge lar deg koble til en annen post. Den viktigste forskjellen er at en Many2one alltid kobler til en spesifikk modell (du velger den ved feltopprettelsen og den endres aldri), mens et Referansefelt lar brukeren velge modellen hver gang de fyller ut feltet. Hvis du opprettet en Many2one når du trengte en Referanse, må du bygge feltet på nytt i stedet for å prøve å tilpasse det eksisterende.

Konklusjon


Referansefeltet fyller et gap som Many2one-feltet ikke kan dekke på egen hånd. Når en lenke må være fleksibel nok til å peke på forskjellige dokumenttyper avhengig av situasjonen, er Referansefeltet det rette verktøyet i Odoo-rammeverket. Det er enkelt å definere, fungerer med Odoo Studio for kodefrie oppsett, og integreres naturlig i Python-modeller for tekniske implementeringer.


De viktigste tingene å huske på er det strengbaserte lagringsformatet, fraværet av automatisk opprydning av fremmednøkler, og behovet for å filtrere ved hjelp av sammensatte strengverdier i stedet for enkle ID-er. Når du forstår disse forskjellene, oppfører feltet seg forutsigbart og pålitelig på tvers av Odoo-datamodellen din.


Enten du bygger en generell godkjenningsflyt, kobler supportbilletter til forskjellige dokumenttyper, eller designer et fleksibelt notatsystem som spenner over flere moduler, gir Referanse-feltet deg en ren og vedlikeholdbar løsning uten å måtte duplisere logikken din for hver modelltype.

Trenger du hjelp med Odoo-implementeringen din?


Hos Dasolo hjelper vi selskaper med å implementere, tilpasse og optimalisere Odoo for å passe deres faktiske forretningsarbeidsflyter. Enten du trenger å bygge tilpasset feltlogikk, designe en datamodell fra bunnen av, eller utvide en eksisterende Odoo-oppsett med ny funksjonalitet, har teamet vårt den tekniske dybden til å få det gjort ordentlig.


Hvis du jobber med et Odoo-prosjekt og trenger veiledning om felttyper, dataarkitektur eller beste utviklingspraksis, er du velkommen til å ta kontakt. Vi er glade for å diskutere situasjonen din og hjelpe deg med å finne den rette tilnærmingen.

Kontakt Dasolo

Referansefelt i Odoo: Den Ultimative Guiden
Dasolo 6. mars 2026
Share this post
Logg inn to leave a comment