Hoppa till innehåll

Referensfält i Odoo: Den Kompletta Guiden

En praktisk guide till Odoo Referensfältet: hur det kopplar poster över flera modeller, när man ska använda det och hur man implementerar det med Studio eller Python
6 mars 2026 av
Referensfält i Odoo: Den Kompletta Guiden
Dasolo
| Inga kommentarer ännu

Introduktion


De flesta Odoo-utvecklare väljer Many2one-fältet när de behöver länka en post till en annan. Det fungerar perfekt i de flesta fall. Men ibland stöter man på en situation där det länkade dokumentet kan vara en av flera olika saker: en försäljningsorder, en inköpsorder, en tillverkningsorder, eller något helt annat beroende på sammanhanget. Det är precis vad Referensfältet är byggt för.


Referensfältet är en av de mer flexibla fälttyperna i Odoo ORM. Det låter dig skapa en länk till en post från vilken modell som helst i en fördefinierad lista, istället för att alltid peka på samma modell. Användaren väljer först dokumenttypen, och väljer sedan den specifika posten. Resultatet är en polymorf länk som kan anpassa sig till olika arbetsflöden.


Denna guide täcker vad Referensfältet lagrar, hur det beter sig i Odoo-datamodellen, hur man skapar och anpassar det med Odoo Studio eller Python, och praktiska affärsanvändningsfall där det verkligen tillför värde.

Vad är Referensfältet i Odoo


I Odoo ORM är Referensfältet en speciell fälttyp som lagrar en länk till en post från vilken modell som helst som du inkluderar i dess selection-lista. Detta gör det fundamentalt annorlunda än ett Many2one-fält, som alltid pekar på en fast modell.


I databasen lagrar Referensfältet sitt värde som en vanlig textsträng i formatet model_name,record_id. Till exempel skulle en referens till försäljningsorder nummer 42 lagras som sale.order,42. Detta är viktigt att förstå om du någonsin behöver fråga eller filtrera dessa poster direkt.


Ur användargränssnittets perspektiv framstår ett Referensfält som en tvåstegsindata. Användaren väljer först en dokumenttyp från en rullgardinslista (till exempel: Försäljningsorder, Faktura eller Projektuppgift), och väljer sedan den specifika posten från den modellen med hjälp av ett sökfält. Gränssnittet är rent och enkelt när användarna förstår den tvåstegsvalet.


Här är vad en grundläggande definition av ett Referensfält ser ut i Python:

from odoo import fields, models

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

    related_document = fields.Reference(
        selection=[
            ('sale.order', 'Sale Order'),
            ('purchase.order', 'Purchase Order'),
            ('account.move', 'Invoice'),
            ('project.task', 'Project Task'),
        ],
        string='Related Document',
    )

selection-parametern är en lista med tupler. Varje tupel innehåller det tekniska modellnamnet (som sale.order) och den mänskligt läsbara etiketten som användarna kommer att se i rullgardinsmenyn. Du kontrollerar exakt vilka modeller som är tillgängliga i denna lista.


Det finns också en dynamisk variant där urvalslistan fylls med data från ir.model-tabellen vid körning, vilket gör alla installerade modeller tillgängliga. Detta är användbart för mycket konfigurerbara verktyg men kan bli överväldigande för slutanvändare om det inte filtreras ordentligt.


I Odoo Studio är Referensfältet tillgängligt under panelen för fälttyper och märkt Referens. När du lägger till det genom Studio kan du konfigurera listan över valbara modeller direkt från gränssnittet utan att skriva någon kod. Detta gör det till ett av de mer tillgängliga alternativen bland de avancerade Odoo-studiofälten.

Hur Fältet Fungerar


Att förstå hur Referensfältet lagrar och hämtar data är nyckeln till att använda det korrekt i dina Odoo-utvecklingsprojekt.


Lagring i databasen

Till skillnad från ett Many2one-fält, som bara lagrar ett heltal (den främmande nyckeln), lagrar Referensfältet ett strängvärde som inkluderar både modellnamnet och post-ID:t. Till exempel: sale.order,15. Detta lagras i en VARCHAR-kolumn i PostgreSQL. Det betyder att databasen inte upprätthåller någon främmande nyckelbegränsning på denna kolumn, vilket är ett medvetet designval för att stödja fältets polymorfa natur.


Eftersom det inte finns någon främmande nyckel på databasnivå rensar Odoo inte automatiskt värdena i Referensfältet när den länkade posten tas bort. Om en försäljningsorder tas bort kommer ett Referensfält som pekar på den fortfarande att innehålla det gamla strängvärdet. Detta är en av de viktigaste beteendemässiga skillnaderna att ha i åtanke under Odoo-utveckling.


Åtkomst till den länkade posten i Python

När du läser ett värde från ett Referensfält i Python returnerar Odoo det faktiska postobjektet från den refererade modellen. Du kan komma åt dess fält direkt, precis som du skulle göra med ett Many2one-resultat. Om fältet är tomt returneras False.


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

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

Detta är en av de bekväma aspekterna av Odoo ORM-abstraktionen. Även om den underliggande lagringen är en vanlig textsträng, löser ramverket det till ett korrekt postobjekt när du får åtkomst till det i koden.


Nyckelfältattribut

Dessa är de mest relevanta attributen du kan konfigurera på ett Referensfält i Odoo-ramverket:


  • selection: En lista med tupler som definierar vilka modeller som kan väljas. Kan också vara ett metodnamn (sträng) som dynamiskt returnerar en sådan lista.
  • string: Fältetiketten som visas för användare i gränssnittet.
  • required: Gör fältet obligatoriskt. Användaren måste välja både en modelltyp och en post innan den sparar.
  • readonly: Förhindrar användare från att ändra fältvärdet från gränssnittet. Användbart när referensen sätts programmässigt.
  • help: En tooltip som visas när användaren hovrar över fältetiketten. Hjälpsam för att vägleda användare om vad de ska välja.
  • compute: Precis som alla andra Odoo-fälttyper kan ett Referensfält beräknas dynamiskt med hjälp av en Python-metod. Detta är användbart för att automatiskt ställa in en referens baserat på affärslogik.

Filtrering och Sökning

Eftersom värdet lagras som en vanlig sträng, kräver filtrering på ett Referensfält specifik domänsyntax. För att söka efter poster kopplade till ett specifikt dokument måste du själv komponera strängvärdet:


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

Du kan också filtrera efter modelltyp med hjälp av en like-operator:


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

Tänk på detta strängbaserade filtreringsbeteende när du utformar rapporter eller beräknade fält som beror på värden från Referensfält. Det beter sig annorlunda än en typisk Many2one domänfilter.

Affärsanvändningsfall


Referensfältet är mest värdefullt i situationer där samma typ av kontextlänk kan peka på dokument av olika typer beroende på situationen. Här är fem praktiska exempel från verkliga affärsarbetsflöden.


1. Helpdeskärenden kopplade till vilket dokument som helst

Ett supportteam hanterar ärenden som kan relatera till mycket olika saker: en fakturakonflikt, ett leveransproblem, en kontraktsfråga eller en defekt produkt. Istället för att skapa ett separat fält för varje dokumenttyp, låter ett enda Referensfält på ärendemodellen agenten koppla till vilket dokument som är relevant. Agenten väljer typ först (Faktura, Försäljningsorder, Leverans, etc.) och väljer sedan den specifika posten. All kontext finns i ett fält.


2. CRM-aktiviteter kopplade till flera källdokument

I ett säljteam härstammar aktiviteter och uppföljningsuppgifter ibland från olika källor: en lead, en offert, ett befintligt kontrakt eller ett supportärende. Ett Referensfält på en anpassad aktivitetsmodell eller CRM-notis låter säljare tagga det ursprungliga dokumentet utan att vara låsta till en enda modell. Detta är en naturlig passform för Referensfältet i en Odoo CRM-anpassning.


3. Anteckningar och kommentarer över moduler

Vissa företag bygger en enkel intern antecknings- eller annoteringsmodell för att logga observationer över olika affärsobjekt. Ett Referensfält gör det möjligt att koppla en enda anteckningspost till en kundpost, en projektuppgift, en tillverkningsorder eller en inköpsorder, allt inom samma fält. Detta undviker att duplicera anteckningsmodellen för varje dokumenttyp.


4. Dokumentgodkännandearbetsflöde

När man implementerar ett generiskt godkännandearbetsflöde behöver godkännandeansökan peka på det dokument som godkänns. Eftersom godkännanden kan gälla inköpsorder, utgiftsrapporter, ledighetsansökningar eller kontrakt, håller ett Referensfält i godkännandemodellen arkitekturen ren. Den samma godkännandelogiken hanterar alla dokumenttyper utan att behöva separata modeller för varje.


5. Utgiftsrapporter kopplade till projekt eller kundorder

I vissa redovisningsinställningar behöver en utgift kopplas till antingen ett kundprojekt eller en försäljningsorder beroende på kostnadens natur. Ett Referensfält med både project.project och sale.order i sin urvalslista ger redovisningspersonen flexibiliteten att koppla utgiften till det dokument som är tillämpligt. Detta är särskilt användbart i professionella tjänster och konsultföretag som kör Odoo.


Skapa eller Anpassa Referensfältet


Det finns två huvudsakliga sätt att lägga till ett Referensfält i en Odoo-modell: använda Odoo Studio för en kodfri metod, eller skriva det direkt i Python för full kontroll.


Använda Odoo Studio

Odoo Studio gör det enkelt att lägga till ett Referensfält till vilket formulär som helst utan att röra koden. Öppna Studio på den modell du vill utöka, gå till panelen Fält och lägg till ett nytt fält av typen Referens. Du kommer att bli ombedd att välja vilka modeller som ska visas i rullgardinslistan. Studio lagrar fältet som ett manuellt fält med ett x_-prefix, precis som andra Odoo-studiofält som skapats genom gränssnittet.


Denna metod är idealisk för snabba anpassningar och för affärsanalytiker som vill utöka formulär utan utvecklarinblandning. Tänk på att Studio-skapade Referensfält kan ha begränsat stöd för avancerade konfigurationer som dynamiska urvalsmetoder eller beräknade värden.


Teknisk implementering i Python

För en fullständig Odoo-utvecklingsmetod, definiera Referensfältet direkt i en Python-modell. Här är ett mer komplett exempel som visar hur man skapar ett Referensfält med en dynamisk urvalsmetod:

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.',
    )

Att använda en metod för selection-parametern (genom att skicka dess namn som en sträng) ger dig mer flexibilitet. Du kan lägga till villkorslogik, filtrera baserat på installerade moduler eller bygga listan dynamiskt från konfigurationsposter.


Skapa via XML-RPC API

Du kan också skapa ett Referensfält programmässigt med Odoo XML-RPC API. Detta är användbart när du distribuerar fält som en del av en fjärrkonfigurationsanteckning. Fälttypen som ska användas är reference och urvalet skickas som en strängrepresentation av listan:


field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_related_document',
        'field_description': 'Relaterad Dokument',
        'model_id': model_id,
        'ttype': 'reference',
        'selection': "[('sale.order', 'Försäljningsorder'), ('purchase.order', 'Inköpsorder')]",
        'state': 'manual',
    }]
)

Observera att när du skapar ett Referensfält genom API:et, skickas selection-värdet som en Python-utvärderbar sträng snarare än en faktisk lista. Så här lagrar och läser Odoo det från ir.model.fields-tabellen.

Bästa Praxis


Här är de mest användbara riktlinjerna att följa när du arbetar med Referensfält i din Odoo-datamodell.


  • Håll urvalslistan kort och meningsfull. Inkludera inte varje modell bara för att du kan. Begränsa listan till de dokumenttyper som verkligen är meningsfulla för användningsfallet. En lång lista förvirrar användarna och gör fältet svårare att använda korrekt.
  • Använd Many2one när du alltid länkar till samma modell. Referensfältet är utformat för polymorfa relationer. Om den länkade modellen aldrig ändras är ett standard Many2one-fält enklare, snabbare att fråga och bättre stöds av Odoo-rapporteringsverktyg.
  • Kontrollera alltid för null-värden i beräknade fält. När ett Referensfält är tomt returnerar det False i Python. All kod som får åtkomst till den länkade posten måste först kontrollera detta för att undvika fel.
  • Hantera föräldralösa referenser i automatiserade åtgärder. Eftersom databasen inte upprätthåller referentiell integritet på Referensfält, är det en bra idé att lägga till en automatiserad åtgärd eller en schemalagd åtgärd som periodiskt kontrollerar och rensar gamla referenser som pekar på raderade poster.
  • Använd beskrivande etiketter för varje modell i urvalet. Det andra elementet i varje tuppel är vad användarna ser i rullgardinsmenyn. Använd tydliga, affärsvänliga etiketter istället för tekniska modellnamn. Skriv "Kundfaktura" istället för "account.move".
  • Dokumentera fältet tydligt i dina tekniska specifikationer. Eftersom Referensfält beter sig annorlunda än standard Many2one-fält, kommer alla utvecklare som ärver din kod att dra nytta av en tydlig förklaring av varför en Referens valdes och vilka modeller den länkar till.

Vanliga Fallgropar


Detta är de misstag vi ser oftast när utvecklare eller affärsanalytiker arbetar med Referensfält för första gången.


Behandla det som en Many2one i Domänfilter

Utvecklare skriver ibland domänfilter för ett Referensfält med samma syntax som en Many2one, till exempel [('document_ref', '=', 15)]. Detta kommer inte att fungera. Det lagrade värdet är en sträng som sale.order,15, inte bara ett heltal. Du måste komponera hela strängvärdet när du bygger domänfilter på ett Referensfält.


Glömma att raderade poster lämnar föräldralösa värden

Eftersom det inte finns någon utländsk nyckelbegränsning i databasen, raderar en refererad post inte värdet i Referensfältet. Om en försäljningsorder raderas och en biljett fortfarande har sale.order,42 i sitt Referensfält, kommer läsning av det fältet att returnera False istället för att höja ett fel. Kod som förlitar sig på att referensen är giltig måste alltid hantera detta fall.


Överanvändning av den dynamiska All-Models-valet

Odoo tillåter dig att skicka en metod för selection som returnerar alla installerade modeller från ir.model. Även om detta är kraftfullt, är det nästan alltid för brett för ett användarvänligt fält. Att presentera hundratals modeller i en rullgardinsmeny är förvirrande och leder till felaktig datainmatning. Begränsa alltid valet till en kuraterad lista av meningsfulla dokumenttyper.


Förväntar sig inbyggd gruppering i rapporter

Referensfält lagras som vanliga textsträngar i databasen. De är inte utländska nycklar, så standard Odoo gruppering och pivot-funktionalitet fungerar inte på dem på samma sätt som det gör på Many2one-fält. Om du behöver gruppera eller aggregera poster efter deras länkade dokument, måste du hantera detta genom anpassad kod eller ett beräknat fält som extraherar modellnamnet som ett separat urval eller char-fält.


Förvirra Referens och Many2one i Odoo Studio

När man använder Odoo Studio blandar vissa användare ihop Referensfältet och Many2one-fältet eftersom båda låter dig länka till en annan post. Den avgörande skillnaden är att en Many2one alltid länkar till en specifik modell (du väljer den vid fältets skapande och den ändras aldrig), medan ett Referensfält låter användaren välja modellen varje gång de fyller i fältet. Om du skapade en Many2one när du behövde en Referens, måste du bygga om fältet istället för att försöka anpassa det befintliga.

Slutsats


Referensfältet fyller ett gap som Many2one-fältet inte kan täcka på egen hand. När en länk behöver vara tillräckligt flexibel för att peka på olika dokumenttyper beroende på situationen, är Referensfältet rätt verktyg i Odoo-ramverket. Det är enkelt att definiera, fungerar med Odoo Studio för kodfria installationer och integreras naturligt i Python-modeller för tekniska implementationer.


De viktigaste sakerna att ha i åtanke är det strängbaserade lagringsformatet, avsaknaden av automatisk städning av utländska nycklar och behovet av att filtrera med hjälp av sammansatta strängvärden snarare än rena ID:n. När du väl förstår dessa skillnader beter sig fältet förutsägbart och pålitligt över din Odoo-datamodell.


Oavsett om du bygger ett generiskt godkännandearbetsflöde, kopplar supportärenden till olika dokumenttyper eller designar ett flexibelt notsystem som sträcker sig över flera moduler, ger Referensfältet dig en ren och underhållbar lösning utan att behöva duplicera din logik för varje modelltyp.

Behöver du hjälp med din Odoo-implementering?


På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo för att passa deras faktiska affärsarbetsflöden. Oavsett om du behöver bygga anpassad fältlogik, designa en datamodell från grunden eller utöka en befintlig Odoo-installation med ny funktionalitet, har vårt team den tekniska djupet för att göra det på rätt sätt.


Om du arbetar med ett Odoo-projekt och behöver vägledning om fälttyper, dataarkitektur eller utvecklingsbästa praxis, tveka inte att kontakta oss. Vi är glada att diskutera din situation och hjälpa dig att hitta rätt tillvägagångssätt.

Kontakta Dasolo

Referensfält i Odoo: Den Kompletta Guiden
Dasolo 6 mars 2026
Dela detta inlägg
Logga in att lämna en kommentar