Hoppa till innehåll

Many2One-Fält i Odoo: En Komplett Guide

En praktisk guide till Many2One-fältet i Odoo-datamodellen, från grundläggande användning till relationell logik och teknisk anpassning
6 mars 2026 av
Many2One-Fält i Odoo: En Komplett Guide
Dasolo
| Inga kommentarer ännu

Introduktion


Many2One-fältet är en av de grundläggande byggstenarna i Odoo-datamodellen. Varje gång du kopplar en försäljningsorder till en kund, tilldelar en produkt till en kategori, eller kopplar en uppgift till ett projekt, arbetar du med en Many2One-relation. Det är den vanligaste relationstypen i Odoo, och att förstå hur det fungerar är avgörande för alla som gör seriös Odoo-utveckling eller anpassning.


Ur ett affärsperspektiv är Many2One-fält det som ger Odoo dess sammanhang som ett integrerat system. Utan dem skulle varje modul vara en ö. Med dem flyter data naturligt från en post till en annan, och användare kan navigera mellan relaterade dokument utan att någonsin tänka på databasstrukturen.


Denna guide täcker vad Many2One-fältet lagrar, hur det beter sig i Odoo ORM och i gränssnittet, hur man skapar och konfigurerar det med Odoo Studio eller Python, och verkliga affärsanvändningsfall från CRM, Försäljning, Lager och Bokföring.

Vad är Many2One-fältet i Odoo


I Odoo ORM skapar ett Many2One-fält en länk från en post till exakt en post i en annan modell. Namnet beskriver relationen från perspektivet av den aktuella modellen: många poster här kan peka på en post där. Till exempel kan många försäljningsorder peka på en kund, och många produkter kan tillhöra en produktkategori.


På databasnivå lagrar ett Many2One-fält en främmande nyckel i den aktuella tabellen. Om en försäljningsorder är kopplad till kund-ID 42, så innehåller kolumnen partner_id i sale_order-tabellen heltalet 42. Odoo hanterar automatiskt sammanfogningen och hämtningen av det relaterade postnamnet.


I användargränssnittet visas ett Many2One-fält som en rullgardinsmeny eller typahead-inmatning. Användare kan börja skriva ett namn, och Odoo filtrerar matchande poster i realtid. Att välja en sätter länken. Fältet visar namnet på den länkade posten, inte dess interna ID. Detta gör det till en av de mest naturliga fälttyperna ur ett användarupplevelseperspektiv.

Så här ser det ut i en Python-modelldefinition:


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

Parametern comodel_name är det tekniska namnet på modellen du länkar till. Parametern ondelete styr vad som händer med den aktuella posten om den länkade posten tas bort. De tre alternativen är cascade (ta bort den aktuella posten också), set null (rensa länken) och restrict (blockera borttagning om någon post pekar på den).


I Odoo Studio visas Many2One-fältet under etiketten Many2One i fältväljaren. När du lägger till ett genom Studio väljer du målmodellen från en lista, och Studio hanterar fältets skapande. Detta gör det till ett av de mest tillgängliga Odoo-studiofälten för att ställa in relationer utan att skriva kod.

Hur fältet fungerar


När du läser ett Many2One-fält genom Odoo ORM får du en postuppsättning som innehåller den länkade posten. Om fältet är tomt får du en tom postuppsättning. I Python kan du direkt komma åt den relaterade posten och navigera till dess fält med hjälp av punktnotation:


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

Denna kedjade navigering är en av de mest bekväma aspekterna av Odoo-ramverket. Du behöver inte skriva explicita sammanfogningar eller separata frågor. ORM hanterar databasjobbet i bakgrunden.

När du läser via XML-RPC API returnerar ett Many2One-fält en lista med två element: det heltal ID för den länkade posten och dess visningsnamn. Till exempel, [42, "Acme Corp"]. Om fältet är tomt returnerar det False. Detta är viktigt att veta när du bearbetar API-svar i dina skript.


Nyckelfältattribut

Detta är de viktigaste egenskaperna du kan konfigurera på ett Many2One-fält i Odoo-ramverket:

  • comodel_name: Det tekniska namnet på målmodellen. Detta är den enda obligatoriska parametern.
  • ondelete: Vad som händer med den aktuella posten när den länkade posten raderas. Alternativen är 'cascade', 'set null' och 'restrict'. Standardvärdet är 'set null'.
  • domain: En filter som begränsar vilka poster användaren kan välja i rullgardinsmenyn. Till exempel, domain=[('customer_rank', '>', 0)] begränsar partnerurvalet till endast kunder.
  • context: Extra kontextvärden som skickas när den relaterade posten eller rullgardinsmenyn öppnas. Användbart för att förfylla fält på ny skapade relaterade poster.
  • required: Gör fältet obligatoriskt. Posten kan inte sparas om inte detta fält är ifyllt.
  • readonly: Förhindrar användare från att ändra den länkade posten. Användbart när länken sätts programmässigt och inte bör ändras manuellt.
  • delegate: När det sätts till True, blir alla fält i den relaterade modellen direkt tillgängliga på den aktuella modellen. Detta används för modellärvande i Odoo-utveckling, inte för vanliga relationella fält.

Hur det visas i vyer

I formulärvyer renderas ett Many2One-fält som en rullgardinsmeny med ett sökfält. Användare kan skriva ett delvis namn för att filtrera listan. De kan också klicka på pilikonen bredvid fältet för att öppna den länkade posten direkt, vilket är mycket användbart för att navigera mellan relaterade dokument utan att gå igenom menyer.


I listvyer visar Many2One-fält namnet på den länkade posten. De stödjer gruppering: du kan gruppera en lista av försäljningsorder efter kund, eller en lista av uppgifter efter projekt. Denna gruppering är en av de mest använda funktionerna i Odoo-rapportering.


I sökvyer kan Many2One-fält användas som filter och gruppering. När du söker efter kund i CRM-pipelinen filtrerar du på ett Many2One-fält.


Den ömsesidiga One2Many

Varje Many2One-relation har en naturlig omvänd: One2Many. Om försäljningsorder länkar till en kund via Many2One, kan kundposten exponera en lista över alla länkade försäljningsorder via ett One2Many-fält. I Odoo-utveckling är det god praxis att skapa båda sidor av relationen. Detta gör att användare kan navigera från kundformuläret till alla deras order utan att behöva göra en separat sökning. One2Many-fältet lägger inte till en databas kolumn; det beräknas från Many2One-främmande nyckel på den andra sidan.

Affärsanvändningsfall


Many2One-fältet finns överallt i en standard Odoo-implementation. Här är fem praktiska exempel från verkliga affärsarbetsflöden.


CRM: Koppla Leads till Säljare

I Odoo CRM-modulen har varje lead eller möjlighet ett user_id-fält, som är en Many2One som pekar på res.users. Detta är säljaren som ansvarar för leaden. Chefer kan filtrera pipelinen efter säljare, se konverteringsgrader per representant och tilldela leads i bulk. Many2One-fältet gör denna typ av segmentering och rapportering möjlig utan anpassad utveckling. Om du vill lägga till en andra säljare eller ett dedikerat kontoansvarigt fält, lägger du helt enkelt till ett annat Many2One-fält som pekar på samma modell.


Försäljning: Koppla Order till Kunder och Priskurser

En försäljningsorder i Odoo har minst två viktiga Many2One-fält: partner_id (kunden, kopplad till res.partner) och pricelist_id (priskursen, kopplad till product.pricelist). När en säljare väljer en kund kan Odoo automatiskt fylla i priskursen, betalningsvillkoren och leveransadressen baserat på kundposten. Denna automatiska ifyllning drivs av onchange-metoder som läser Many2One-värdet och fyller i relaterade fält. Det är en av de mest synliga fördelarna med en välstrukturerad Odoo-datamodell.


Lager: Produkter och Kategorier

Varje produkt i Odoo tillhör en produktkategori via ett Many2One-fält (categ_idproduct.template). Produktkategorin kontrollerar redovisningskonton för sålda varor och intäkter, värderingsmetoder och borttagningsstrategier i lager. Att få kategoriuppdraget rätt på varje produkt är avgörande för korrekt finansiell rapportering. Ett Many2One-fält gör denna uppdragning enkel: en rullgardinsmeny per produkt, en kategori post som delas över hundratals produkter.


Redovisning: Journalposter och Journaler

Varje journalpost i Odoo är kopplad till en redovisningsjournal via ett Many2One-fält (journal_idaccount.move). Journalen bestämmer sekvensen som används för dokumentnummer, typen av post (försäljning, inköp, bank, kontant, diverse) och i vissa fall de standardmässiga debet- och kreditkontona. Att välja fel journal på en leverantörsfaktura eller en betalning skapar poster i fel avsnitt av den allmänna huvudboken. Many2One-fältet här är inte bara en bekvämlighet; det är en kontrollpunkt för redovisningsnoggrannhet.


Projektledning: Uppgifter och Projekt

I Odoo Projektmodulen tillhör varje uppgift ett projekt via ett Many2One-fält (project_idproject.task). Denna enda länk avgör vilken stegprogression uppgiften följer, vilka teammedlemmar som kan få tillgång till den och hur tidrapporter fördelas. För professionella tjänsteföretag som fakturerar per projekt är Many2One-länken mellan tidrapporter, uppgifter och moderprojektet ryggraden i intäktsredovisning och faktureringsarbetsflöden.

Skapa eller anpassa Many2One-fältet


Det finns tre huvudsakliga sätt att lägga till ett Many2One-fält i en Odoo-modell, beroende på din tekniska kontext och distributionsmetod.


Använda Odoo Studio (Ingen kod)

Odoo Studio är det inbyggda lågkodanpassningsverktyget. För att lägga till ett Many2One-fält utan att skriva någon kod:

  1. Öppna Odoo Studio från huvudmenyn.
  2. Navigera till formuläret där du vill ha fältet.
  3. Dra ett Many2One-fält från fältväljaren till formuläret.
  4. I egenskapspanelen, välj målmodellen från listan.
  5. Ställ in etiketten och eventuella valfria domänfilter för att begränsa vilka poster användare kan välja.
  6. Spara och stäng Studio.

Studio skapar fältet med ett x_studio_-prefix och lägger automatiskt till det i formulärvyn. Fältet är omedelbart funktionellt: användare kan öppna rullgardinsmenyn, söka efter länkade poster och välja en. Detta är ett av de snabbaste sätten att utöka ett formulär med en relationell länk, och det kräver ingen teknisk kunskap utöver att förstå vad de två modellerna representerar i din verksamhet.


Använda Python i en anpassad modul

För utvecklare som bygger Odoo-moduler definieras Many2One-fält direkt i Python. Detta är den rekommenderade metoden för all Odoo-utveckling som behöver versionskontrolleras och distribueras över flera 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='Den huvudsakliga kontakten hos kunden för denna uppgift.',
    )

Efter att ha definierat fältet i modellen, inkludera det i den relevanta vy-XML:en och kör en uppgradering för att tillämpa databasändringarna. Denna metod ger full kontroll över domänfilter, ondelete-beteende och integration med beräkningsmetoder och begränsningar. Det är den standardmetod som Odoo-utvecklarhandboken rekommenderar för relationsfält i produktionsmoduler.


När du skapar en Many2One som en del av Odoo-anpassning är det också god praxis att lägga till det motsvarande One2Many-fältet på den relaterade modellen så att användare kan navigera i båda riktningarna av relationen:


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

    x_task_ids = fields.One2Many(
        comodel_name='project.task',
        inverse_name='x_client_contact_id',
        string='Relaterade Uppgifter',
    )

Använda XML-RPC API

Om du hanterar Odoo-anpassningar programmässigt, till exempel genom ett distributionsskript eller en fjärrkonfigurationsnotebook, kan du skapa Many2One-fält via XML-RPC API:


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

Nyckeln relation specificerar målmodellen. Nyckeln on_delete ställer in raderingsbeteendet. När du skapar via API:et, kom alltid ihåg att också skapa det ömsesidiga One2Many-fältet på den relaterade modellen så att navigering fungerar från båda sidor av relationen. Detta är en av de obligatoriska reglerna i Dasolo-fjärrkonfigurationer för skapande av vilket Many2One-fält som helst.

Bästa praxis


1. Skapa alltid det ömsesidiga One2Many

När du lägger till ett Many2One-fält i en modell, skapa också det motsvarande One2Many på den relaterade modellen. Detta kostar dig ingen extra databas kolumn, men det gör navigeringen mycket mer naturlig för användarna. Utan det har användarna ingen möjlighet att se från kundformuläret vilka uppgifter, beställningar eller anpassade poster som är kopplade till dem.


2. Använd domänfilter för att begränsa urvalet

Ett Many2One-fält som pekar på res.partner ger som standard tillgång till alla partners, inklusive leverantörer, kunder, interna användare och leveransadresser. Om din affärslogik endast är meningsfull för kunder, lägg till ett domänfilter som domain=[('customer_rank', '>', 0)]. Detta minskar bruset i rullgardinsmenyn och förhindrar att användare gör felaktiga val som ser giltiga ut men ger fel resultat längre ner i processen.


3. Välj ondelete noggrant

Beteendet för ondelete är viktigare än det verkar. Att använda 'cascade' innebär att radering av den länkade posten också kommer att radera alla poster som pekar på den. Detta kan orsaka oavsiktliga massraderingar om det inte är avsett. I de flesta affärsscenarier är 'set null' det säkraste valet: det rensar länken utan att radera något. Använd 'restrict' när den länkade posten aldrig bör raderas så länge något pekar på den, till exempel en produktkategori som har produkter tilldelade till sig.


4. Undvik att duplicera data som borde vara en Many2One

Ett vanligt misstag i tidiga Odoo-anpassningsprojekt är att lägga till ett char-fält för att lagra ett företagsnamn eller en kategorietikett, när en Many2One som pekar på en befintlig modell skulle vara rätt tillvägagångssätt. Char-fält för värden som redan finns som poster i en annan modell skapar dataduplicering, gör filtrering och gruppering opålitlig och ger upphov till inkonsekvenser när namn ändras. Om de data du behöver finns i en annan modell, använd en Many2One.


5. Använd kontext för att förifylla relaterade poster

Attributet context på ett Many2One-fält låter dig skicka standardvärden när användare skapar en ny länkad post direkt från rullgardinsmenyn. Till exempel, om en Many2One pekar på en kontakt inom ett projekt, kan du förifylla projektet på den nya kontaktposten med hjälp av kontext. Detta minskar manuellt arbete och hjälper till att upprätthålla datakonsistens när användare skapar relaterade poster i farten.

Vanliga fallgropar


Att glömma den ömsesidiga One2Many

Att lägga till ett Many2One-fält utan att skapa den omvända One2Many på den relaterade modellen är den vanligaste förbiseelsen i Odoo-anpassning. Resultatet blir en ensidig länk: du kan se den länkade posten från den aktuella modellen, men från den länkade posten har du inget sätt att hitta alla poster som pekar på den. Användare börjar klaga på att de inte kan hitta relaterade poster, och någon slutar med att bygga en anpassad sökning eller rapport för att kompensera för ett saknat omvänt fält.


Att använda kaskadradering utan att tänka efter

Att ställa in ondelete='cascade' på en Many2One som länkar operativa poster till en huvudpost kan orsaka allvarlig dataloss. Om en användare arkiverar eller raderar en produktkategori, och alla produkter kopplade till den har kaskadradering, försvinner varje produkt i den kategorin. I de flesta fall är set null eller restrict det lämpliga beteendet för affärsdata.


Att inte kontrollera för False när man navigerar i Python

När ett Many2One-fält är tomt returnerar läsning av det en tom recordset i Python, vilket är falskt. Om din kod gör order.partner_id.name utan att kontrollera om partner_id är inställt, kommer det att returnera en tom sträng istället för att höja ett fel. Det är ofta acceptabelt, men om du navigerar flera nivåer djupt (order.partner_id.country_id.name) och någon länk i kedjan är tom, får du en tom sträng i slutet, vilket kan tyst producera felaktig utdata i rapporter eller e-post. Kontrollera alltid för tomma recordsets när fältet inte är obligatoriskt.


Pekar på fel modell

I Odoo används res.partner för kunder, leverantörer, kontakter och företag på en gång. En Many2One som pekar på res.partner utan en domänfilter ger tillgång till alla dessa. Om du avsåg att fältet endast skulle vara för kunder men glömde domänen, kommer säljare att se interna användare, leveransadresser och leverantörskontakter i rullgardinsmenyn. Definiera alltid en domänfilter som matchar det faktiska affärssyftet med fältet.


Överanvändning av Many2One där ett urvalsfält skulle räcka

Om de länkade värdena är en fast, liten lista som aldrig förändras, är ett urvalsfält ofta enklare och mer prestandaeffektivt än en Many2One. Many2One-fält kräver en separat modell med poster, och de lägger till en databasanslutning vid varje fråga. För något som en status med tre eller fyra alternativ är ett urvalsfält renare. Använd Many2One när uppsättningen av möjliga värden är stor, hanteras av användare eller delas över flera modeller.

Slutsats


Many2One-fältet är kärnan i hur Odoo kopplar data över moduler. Att förstå det är inte bara en utvecklarfråga. Affärsanalytiker, funktionella konsulter och kraftanvändare som vill utöka Odoo med Studio drar alla nytta av att veta vad en Many2One gör, när man ska använda en och vad man ska se upp för.


De viktigaste punkterna att komma ihåg: skapa alltid den ömsesidiga One2Many så att navigeringen fungerar från båda sidor, använd domänfilter för att hålla rullgardinsmenyer rena och relevanta, välj din ondelete-beteende medvetet och undvik att använda Many2One där ett enklare urvalsfält skulle göra jobbet.


Oavsett om du konfigurerar ett fält genom Odoo Studio, skriver en anpassad Python-modul eller hanterar din Odoo-datamodell genom XML-RPC API, gör det att få relationella fält rätt från början din implementation mer pålitlig och mycket lättare att underhålla över tid.

På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo över alla avdelningar. Oavsett om du behöver hjälp med att designa en ren datamodell, lägga till relationella fält i dina formulär eller bygga en fullständig Odoo-modul från grunden, är vårt team här för att stödja dig. Kontakta oss och låt oss prata om ditt Odoo-projekt.

Many2One-Fält i Odoo: En Komplett Guide
Dasolo 6 mars 2026
Dela detta inlägg
Logga in att lämna en kommentar