Introduksjon
Hver gang en bruker velger en lead-prioritet, velger en betalingsmetode, eller merker et produkt som aktivt eller arkivert i Odoo, interagerer de mest sannsynlig med et utvalgsfelt. Det er en av de mest praktiske felttypene i Odoo-rammeverket, og en av de viktigste å forstå hvis du ønsker å bygge rene, pålitelige datamodeller.
I motsetning til et fritekstfelt der brukere kan skrive hva som helst, begrenser utvalgsfeltet inndata til en forhåndsdefinert liste med valg. Den begrensningen er hele poenget. Den holder dataene dine konsistente, gjør filtrering og rapportering mer nøyaktig, og forhindrer typen skrivefeil og variasjoner som stille bryter aggregater og dashbord over tid.
Denne guiden dekker alt fra hva feltet lagrer og hvordan det vises i grensesnittet, til å opprette og tilpasse det gjennom Odoo Studio, Python-moduler eller XML-RPC API. Du vil også finne praktiske eksempler fra virkelige forretningsarbeidsflyter og en liste over vanlige feil å unngå.
Hva er utvalgsfeltet i Odoo
I Odoo ORM lagrer utvalgsfeltet en strengverdi valgt fra en fast liste med alternativer. Hvert alternativ er definert som et nøkkel-verdi-par: nøkkelen er det som lagres i databasen, og etiketten er det brukeren ser i grensesnittet.
For eksempel kan et prioritetsfelt defineres med følgende alternativer:
priority = fields.Selection([
('0', 'Normal'),
('1', 'Lav'),
('2', 'Høy'),
('3', 'Svært Høy'),
], string='Prioritet', default='0')
I dette eksemplet er '0', '1', '2', og '3' nøklene som lagres i databasen. Etikettene Normal, Lav, Høy, og Svært Høy er det brukerne ser på skjermen. Denne separasjonen er veldig viktig når det gjelder å endre etiketter senere uten å bryte eksisterende poster.
I grensesnittet vises et valgfelt som en nedtrekksliste i skjemaer. I listevisninger viser det den menneskelig lesbare etiketten. Når du bruker badge-widgeten, gjengis hvert alternativ som en farget tag, noe som gjør verdien umiddelbart synlig i tette listevisninger.
I Odoo Studio kalles denne felttypen et Valg-felt. Når det opprettes gjennom Studio, får det et x_studio_-prefiks. Når det opprettes via kode eller XML-RPC API, velger du det tekniske navnet.
Hvordan feltet fungerer
I Odoo datamodellen lagres valgfeltene i PostgreSQL som en VARCHAR-kolonne. Databasen lagrer aldri etiketten, bare nøkkelen. Dette er viktig å huske på når du skriver domene-filtre eller serverhandlinger, siden du må bruke nøkkelen, ikke den menneskelig lesbare verdien.
For eksempel, for å søke etter alle leads med høy prioritet, ville domenet ditt være [('priority', '=', '2')], ikke [('priority', '=', 'Høy')].
Nøkkelfeltattributter
Her er de viktigste egenskapene til et valgfelt i Odoo-rammeverket:
- selection: Listen over
(nøkkel, etikett)-tupler som definerer de tilgjengelige alternativene. Dette kan også være et metodenavn (streng) som dynamisk returnerer en liste. - default: Nøkkelen til alternativet som skal brukes når ingen verdi er satt ennå. Hvis den utelates, starter feltet tomt.
- required: Tvinger brukeren til å velge et alternativ før lagring. Kombinert med en standardverdi, er dette et vanlig mønster for statusfelt.
- selection_add: Brukt i modularv for å legge til nye alternativer til et eksisterende valgfelt uten å redefinere hele listen. Dette er den riktige tilnærmingen når man utvider et innebygd felt.
- ondelete: Fungerer sammen med
selection_addfor å definere hva som skjer med poster med et slettet alternativ når modulen som la det til avinstalleres.
Statisk vs Dynamiske Valglister
Som standard er listen over alternativer definert statisk i feltdeklarasjonen. Men du kan også sende et metodenavn som en streng til selection-parameteren. Odoo vil kalle den metoden ved kjøring for å bygge listen, noe som lar deg vise forskjellige alternativer avhengig av den nåværende brukeren, det nåværende selskapet eller annen kontekst.
contract_type = fields.Selection(
selection='_get_contract_types',
string='Kontraktstype'
)
def _get_contract_types(self):
if self.env.user.has_group('hr.group_hr_manager'):
return [('permanent', 'Fast'), ('fixed', 'Fast Ansettelse'), ('interim', 'Vikar')]
return [('permanent', 'Fast'), ('fixed', 'Fast Ansettelse')]
Hvordan Det Visas i Visninger
I en skjema-visning vises et valgfelt som en standard nedtrekksmeny. Du kan også bruke widget="badge"-attributten for å vise det som en farget etikett, noe som fungerer godt i liste- og kanban-visninger for statusfelt. Attributten widget="radio" viser alternativene som inline radioknapper, noe som passer for felt med et lite antall valg der du vil ha alle alternativer synlige samtidig.
Interaksjon med Odoo ORM
Å lese og skrive valgfelt i Odoo ORM fungerer enkelt. Du tildeler nøkkelen direkte, og rammeverket håndterer visningsmappingen automatisk. Når du leser en post gjennom XML-RPC API med fields_get, inkluderer selection-attributten til feltet hele listen over [nøkkel, etikett]-par, som du kan bruke til å bygge din egen visningslogikk i eksterne verktøy.
Forretningsbrukstilfeller
Valgfeltet vises i praktisk talt hver modul i en standard Odoo-implementering. Her er fem konkrete eksempler fra vanlige forretningsarbeidsflyter.
CRM: Lead Prioritet og Pipeline Stage Type
Prioritetsfeltet på CRM-leads er et innebygd valgfelt med fire nivåer: Normal, Lav, Høy og Veldig Høy. Salgsteam bruker det for å fokusere oppmerksomheten på de mest lovende mulighetene. Det går direkte inn i fargekoding av Kanban-visningen og kan brukes i automatiserte handlinger for å utløse oppfølgingsoppgaver når en lead eskaleres. Å få prioritetsfordelingen riktig er en av de første datakvalitetsforbedringene de fleste CRM-team gjør etter å ha gått live.
Salg: Betalingsbetingelser og fakturapolitikk
Feltet invoice_policy på produkter er et valgfelt som kontrollerer om fakturering er basert på bestilte mengder eller leverte mengder. Dette enkeltfeltet bestemmer hele faktureringsflyten for et produkt. På samme måte bruker faktureringsmodusen på abonnementskontrakter et valgfelt for å skille mellom forhåndsbetalte og etterbetalte faktureringssykluser. Begge disse er gode eksempler på valgfelt som har betydelige konsekvenser for økonomiske arbeidsflyter.
Lager: Produkt- og parti kvalitetsstatus
I produksjons- og kvalitetskontrollarbeidsflyter brukes valgfelt for å spore tilstanden til partier, serienumre og reparasjonsordrer. Feltet for reparasjonsordrestatus, for eksempel, går gjennom verdier som utkast, bekreftet, under reparasjon, klar og ferdig. Hver overgang kan utløse automatiserte e-poster, lagerbevegelser eller regnskapsoppføringer. Valgfeltet fungerer som kontrollpunktet som hele arbeidsflyten er bygget rundt.
Regnskap: Betalingsmetode og journaltype
Feltet for journaltype i Odoo Regnskap er et valgfelt som skiller mellom salgsjournaler, innkjøpsjournaler, kontantjournaler og bankjournaler. Odoo bruker denne verdien for å anvende riktig bokføringslogikk, bestemme hvilke kontoer som er tilgjengelige, og begrense visse operasjoner til de riktige journaltypene. Dette er et godt eksempel på et valgfelt som kontrollerer forretningsregler snarere enn bare å merke en post.
HR: Ansettelsestype og kontraktsstatus
HR-team bruker valgfelt for å spore ansettelsestyper, kontraktsstatus og permisjonsforespørselstatus. Kontraktsstatusen, for eksempel, går fra ny til åpen til utløpt eller kansellert. Automatiseringer kan varsle HR-lederen en måned før en kontrakt utløper, utløse onboarding-sjekklister når en ny ansatt begynner, og oppdatere lønnsregler basert på ansettelsestype. Valgfeltet holder tilstanden som driver all denne logikken.
Opprette eller tilpasse utvalgsfeltet
Det er tre hovedmåter å legge til et valgfelt i en Odoo-modell, avhengig av oppsettet ditt og om du trenger at endringen skal være versjonskontrollert eller anvendt programmatisk.
Bruke Odoo Studio (Ingen kode)
Odoo Studio er det innebygde lavkodeverktøyet for å legge til felt uten å skrive noe Python. For å legge til et valgfelt gjennom Studio:
- Åpne Odoo Studio fra hovedmenyen.
- Naviger til skjemaet der du vil ha feltet.
- Dra et Utvalg-felt fra sidepanelet til skjemaet.
- Legg til alternativene dine i feltets egenskapspanel, og skriv inn en etikett for hvert valg.
- Valgfritt, sett en standardverdi og merk feltet som obligatorisk.
- Lagre og lukk Studio.
Studio lagrer hvert alternativ med en automatisk generert nøkkel og etiketten du oppga. Feltet får et x_studio_-prefiks og legges automatisk til i skjemaets visning. Dette er den raskeste tilnærmingen for å legge til et Utvalg-felt under en forretningsanalyseøkt med en klient.
Bruke Python i et Tilpasset Modul
For utviklere som bygger Odoo-moduler, defineres Utvalg-felt i Python-modellfiler. Dette er den anbefalte tilnærmingen for tilpasninger som må versjonskontrolleres og distribueres på tvers av flere miljøer:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_delivery_slot = fields.Selection([
('morning', 'Morgen (8h - 12h)'),
('afternoon', 'Ettermiddag (13h - 17h)'),
('evening', 'Kveld (18h - 20h)'),
], string='Leveringsvindu', default='morning')
Etter å ha definert feltet, legger du det til i den relevante visningen XML-fil slik at det vises i grensesnittet. Odoo håndterer opprettelsen av databasens kolonne når du installerer eller oppgraderer modulen.
Når du utvider et innfødt felt med nye alternativer, bruk selection_add i stedet for å redefinere feltet:
class SaleOrder(models.Model):
_inherit = 'sale.order'
state = fields.Selection(
selection_add=[('custom_approval', 'Venter på godkjenning')],
ondelete={'custom_approval': 'sett standard'}
)
Bruke XML-RPC API
Hvis du administrerer Odoo-tilpasninger programmatisk, for eksempel som en del av en distribusjonspipeline eller en ekstern konfigurasjonsnotatbok, kan du opprette valgfelter via XML-RPC API:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_contract_category',
'field_description': 'Kontraktkategori',
'model_id': model_id,
'ttype': 'selection',
'selection': "[('standard', 'Standard'), ('premium', 'Premium'), ('custom', 'Tilpasset')]",
'state': 'manual',
}]
)
Merk at når du oppretter et valgfelt gjennom API-en, blir selection-verdien sendt som en strengrepresentasjon av Python-listen. Verdien state: manual forteller Odoo at dette feltet ble opprettet manuelt, noe som er den riktige innstillingen for felt opprettet gjennom Studio eller API-en. Slik håndterer Dasolo opprettelse av eksterne felt for kunder som en del av automatiserte konfigurasjonsskript.
Beste praksis
1. Bruk meningsfulle og stabile nøkler
Nøkkelen er det som lagres i databasen og brukes i domene-filtre, automatiserte handlinger og serverlogikk. Velg en nøkkel som klart beskriver alternativet og som du ikke trenger å endre senere. Korte små bokstaver fungerer godt: 'draft', 'confirmed', 'cancelled'. Unngå numeriske nøkler med mindre sekvensen virkelig betyr noe, fordi de gjør koden din vanskeligere å lese og forstå måneder senere.
2. Hold listen kort og uttømmende
Et valgfelt med mer enn åtte eller ti alternativer er vanligvis et tegn på at feltet prøver å gjøre for mye. Hvis listen fortsetter å vokse, vurder om en Many2one-relasjon til en konfigurasjonsmodell ville vært mer passende. Det gir brukerne muligheten til å administrere alternativene selv gjennom grensesnittet, uten at en utvikler må oppdatere kode eller en databasefeltdefinisjon.
3. Sett alltid en standard for obligatoriske felt
Hvis et valgfelt er obligatorisk, sett også en fornuftig standardverdi. Dette forhindrer valideringsfeil når poster opprettes programmatisk, gjennom import eller via API-en, der brukeren ikke er til stede for å gjøre et valg. Standarden bør representere den vanligste eller minst forpliktede tilstanden i arbeidsflyten.
4. Bruk selection_add når du utvider native felt
Hvis du trenger å legge til alternativer til et eksisterende Odoo-felt i et tilpasset modul, bruk selection_add i stedet for å redefinere hele feltet. Dette er tryggere og mer kompatibelt med andre moduler som også kan utvide det samme feltet. Par alltid med ondelete-parameteren for å håndtere hva som skjer når modulen din avinstalleres.
5. Bruk badge-widgeten for synlighet i listevisninger
I liste- og kanbanvisninger er standardvisningen av et valgfelt bare tekst. Å legge til widget="badge"-attributtet i visnings-XML gjør at hver verdi blir til en farget etikett, noe som gjør feltet mye lettere å skanne ved første øyekast. Dette er spesielt nyttig for statusfelt der brukere raskt må identifisere poster som trenger oppmerksomhet.
Vanlige fallgruver
Å endre en nøkkel bryter eksisterende data
Etiketten til et valgalternativ kan endres trygt når som helst, siden bare nøkkelen lagres i databasen. Nøkkelen må imidlertid aldri endres når poster med den verdien eksisterer. Hvis du gir en nøkkel et nytt navn, vil alle eksisterende poster med den gamle nøkkelen vise en tom eller ugyldig verdi i grensesnittet, og eventuelle domene-filtre eller automatiseringer som bruker den gamle nøkkelen vil stille slutte å fungere. Hvis en nøkkel virkelig må endres, må du kjøre et datamigreringsskript for å oppdatere alle eksisterende poster først.
Fjerning av et alternativ etterlater foreldreløse poster
Hvis du fjerner et alternativ fra listen mens poster fortsatt har den nøkkelen, vil disse postene vise en manglende eller ødelagt verdi. Før du fjerner et alternativ, søk etter poster som fortsatt bruker det og oppdater dem til en gyldig verdi eller arkiver dem. Dette er et vanlig problem under datarensingsprosjekter når listen over alternativer ble designet uten tilstrekkelig analyse på forhånd.
Bruke etiketten i stedet for nøkkelen i domene-filtre
En veldig vanlig feil, spesielt for mindre tekniske brukere som skriver automatiseringsregler i Odoo-grensesnittet, er å filtrere etter den menneskelig lesbare etiketten i stedet for den lagrede nøkkelen. Dette produserer et domene som returnerer null resultater uten å heve en feil, noe som kan være vanskelig å diagnostisere. Sjekk alltid feltdefinisjonen for å bekrefte hvilken nøkkel som tilsvarer hvilken etikett før du skriver et filter.
Bruke et valgfelt der en Many2one er mer passende
Hvis listen over alternativer endres ofte, hvis brukerne trenger å administrere den selv uten utviklerinvolvering, eller hvis alternativene har ekstra attributter som en farge, en sekvens eller en tilknyttet konto, så er en Many2one-relasjon til en konfigurasjonsmodell det bedre valget. Valgfelt er ideelle for stabile, utvikleradministrerte lister. For noe mer dynamisk er Many2one mer vedlikeholdbart på lang sikt.
Ikke håndtere den tomme verdien i serverlogikk
Et valgfelt som ikke er påkrevd kan ha en False-verdi når ingen alternativ er valgt. Hvis Python-koden din eller den automatiserte handlingen sammenligner feltverdien med en streng uten først å sjekke for False, vil du få uventet oppførsel eller feil. Håndter alltid den tomme saken eksplisitt i serverhandlinger og beregnede felt som avhenger av et valgfelt.
Konklusjon
Utvalg-feltet er en av de felttypene som ser enkel ut, men har reell dybde når du forstår hvordan det fungerer under panseret. Å vite forskjellen mellom en nøkkel og en etikett, forstå når du skal bruke selection_add versus å redefinere et felt, og gjenkjenne når en Many2one ville tjene deg bedre, er de typene distinksjoner som skiller en godt utformet Odoo-implementering fra en som forårsaker problemer et år senere.
Enten du legger til en kontrakttype gjennom Odoo Studio, definerer et leveringsvindu-felt i et tilpasset Python-modul, eller oppretter et kvalitetsstatus-felt gjennom API-en, gir mønstrene beskrevet i denne guiden deg det du trenger for å ta den riktige beslutningen for ditt bruksområde.
I Odoo-datamodellen er Utvalg-feltet et av de primære verktøyene for å håndheve datakvalitet ved kilden. Brukt riktig, holder det registrene dine rene, rapportene dine nøyaktige, og automatiseringene dine pålitelige.
Hos Dasolo hjelper vi selskaper med å implementere, tilpasse og optimalisere Odoo på tvers av alle avdelinger. Enten du trenger hjelp til å designe en ren datamodell, legge til tilpassede felt i arbeidsflytene dine, eller bygge et fullstendig Odoo-modul fra bunnen av, er vårt team her for å hjelpe. Ta kontakt med oss og la oss snakke om prosjektet ditt med Odoo.