Innledning
Har du noen gang åpnet en salgordre, en prosjektoppgave eller en produksjonsordre i Odoo? Da har du allerede møtt et datofelt. Alt fra leveringsdatoer og forfallsdatoer til kontraktens startdato blir som regel lagret i et slikt felt — de er ryggraden i all tidsfølsom informasjon i systemet.
For sluttbrukere er datofeltet enkelt: man klikker og velger en dato fra kalenderen. Men under overflaten finnes regler i datamodellen som avgjør hvordan verdien lagres, formateres og deles mellom brukere. Å forstå forskjellen mellom datofelt og tidspunktsfelt (DateTime), og hvordan man oppretter eller tilpasser feltet, reduserer risikoen for overraskelser når teamet ditt planlegger og automatiserer prosesser.
Denne veilederen gir en helhetlig innføring i datofeltet i Odoo: hva det faktisk sparer, hvordan det brukes i UI og ORM, når du bør velge det fremfor tidspunktsfelt, og praktiske råd for implementasjon i forretningsprosesser.
Hva er et datofelt i Odoo
I Odoo sin modell representerer et datofelt en ren kalenderdato — år, måned og dag — uten tid på døgnet. Verdien «2026-03-06» inneholder ingen timer, minutter eller sekunder; det er kun datoen som betyr noe.
I databasen (PostgreSQL) korresponderer dette med en kolonne av typen DATE. Det skiller seg fra et DateTime-felt, som lagres som TIMESTAMP og inkluderer et presist tidspunkt ned til sekundet.
I brukergrensesnittet vises datofeltet som et tekstfelt med en kalendervelger. Brukere kan skrive direkte eller plukke en dato fra popup-kalenderen, og i listevisninger vises datoen formatert i henhold til brukerens språk- og lokalinnstillinger.
Slik defineres et datofelt i en egen modul (eksempel)
Eksempel på Python-definisjon av et datofelt i en modell:
from odoo import fields, models
class ProjectTask(models.Model):
_inherit = 'project.task'
x_deadline_confirmed = fields.Date(
string='Bekreftet frist',
help='Den offisielt bekreftede fristen avtalt med kunden.',
)
I Odoo Studio heter feltet enkelt «Date» og får automatisk et x_studio_-prefiks når det opprettes via UI. Hvis du lager feltet i Python eller via API, bestemmer du selv det tekniske navnet.
Hvordan datofeltet fungerer
Dato vs. Tidspunkt: hva som egentlig er forskjellen
Det viktigste å huske er hva et datofelt ikke inneholder: tid. Det finnes ingen tidskomponent og ingen tidssonekonvertering — kun selve kalenderdatoen.
Et DateTime-felt derimot lagrer et nøyaktig tidspunkt i UTC. Når Odoo viser dette for en bruker, konverteres tidspunktet til brukerens tidssone. Det er ofte kilden til forvirring når datoer tilsynelatende «skifter dag» for forskjellige brukere; slike problemer stammer som regel fra DateTime-felt, ikke rene datofelt.
Når du bruker et datofelt, er verdien lik for alle: 2026-03-15 er alltid 2026-03-15 uansett hvor i verden brukeren befinner seg.
Viktige feltattributter
Her er de mest nyttige innstillingene du kan bruke på et datofelt i Odoo-rammeverket:
- required: Gjør feltet obligatorisk både i modell og UI.
- default: Setter en standardverdi, for eksempel fields.Date.today for dagens dato ved opprettelse.
- index: Lager en databaseindeks for raskere filtrering og søk på feltet.
- compute: Knytter en Python-metode som beregner verdien dynamisk.
- store: I kombinasjon med compute lagres den beregnede verdien i databasen.
- readonly: Forhindrer at brukere endrer feltet i grensesnittet.
- copy: Styrer om verdien kopieres ved duplikat; standard er True.
Slik vises det i visninger
I skjema vises datofeltet som et tekstfelt med kalender-popup, i lister som formatert tekst, og i søk har du innebygde datointervaller som «denne uken», «denne måneden» samt operatorer som før, etter og lik en bestemt dato.
Visningsformatet følger brukerens språkinnstilling: noen ser MM/DD/YYYY, andre DD/MM/YYYY. Uansett lagres den faktiske verdien internt i ISO-format (YYYY-MM-DD).
Samspill med Odoo ORM
Når du leser et datofelt via ORM i Python får du et datetime.date-objekt eller False hvis feltet er tomt. Ved skriving kan du gi et datetime.date-objekt eller en streng i «YYYY-MM-DD»-format. Over XML-RPC sendes og mottas datoer som strenger.
Det er få kompliserte transformasjoner på datofelt — rammeverket tar seg av lagring og formatering automatisk, noe som gjør feltet praktisk i daglig utvikling og drift.
Praktiske forretningsscenarier
Hvor brukes datofelt i praksis? Her er fem konkrete eksempler fra virksomheten.
CRM: kontraktens start- og sluttdato
I salg og CRM er det vanlig å spore når en kontrakt starter og når den utløper. Et dedikert datofelt på lead, kontrakt eller abonnement gjør det enkelt å rapportere aktive avtaler og planlegge fornyelser.
Kombiner dette med automatisering, så kan systemet sende påminnelser eller endre status før kontrakten går ut — uten at selgerne trenger å følge opp manuelt. Slike automatiske varsler reduserer tapte fornyelser betydelig.
Salg: ønsket leveringsdato
Kunder ber ofte om en spesifikk leveringsdag på ordre. Mange legger inn et «Kundens ønskede leveringsdato»-felt på salgordre for å gi produksjon og logistikk et klart planleggingsmål.
Ved å bruke datofelt istedenfor tidspunkt unngår man tidssoneproblemer under koordinering mellom salg og lager. Alle ser samme kalenderdag, uten uønskede konverteringer.
Lager: utløpsdatoer på partier
Innen næringsmidler, medisiner eller kjemikalier må partier ha registrerte utløpsdatoer. Lagerstyringen bruker datofelt for å lagre best-før og utløpsdato på stock.lot.
Disse datoene brukes i plukkestrategier som FEFO (first expired, first out) og utløpsvarsler, som hjelper bedriften med å overholde regelverk og sikre produktkvalitet uten manuell sjekking.
Regnskap: fakturaens forfallsdato
Forfallsdatoer på fakturaer er datofelt. De styrer når purringer sendes, hvordan forfalte fakturaer identifiseres og hvordan aldringsrapporter beregnes.
Riktige forfallsdatoer er helt sentralt for likviditetsstyring. Feil dato kan føre til at oppfølging og kontantstrøm bryter sammen uten å gi tydelige feilmeldinger.
HR: ansettelses- og sertifikatdatoer
HR trenger datofelt for ansettelsesdato, sluttdato for prøvetid, kontraktsperioder og sertifikatutløp. Disse datoene trigger e-poster, varsler og påvirker lønnsregler.
Et robust HR-oppsett i Odoo forutsetter korrekte datofelt på ansattkortene — mange kritiske automasjoner avhenger av disse verdiene.
Opprette eller tilpasse datofeltet
Det finnes tre vanlige måter å legge til et datofelt på, avhengig av hvor teknisk du er og hvordan du drifter Odoo-miljøet ditt.
Bruke Odoo Studio (uten koding)
Odoo Studio er den enkleste måten å legge til et datofelt uten å skrive kode, og passer fint for konsulenter og forretningsbrukere som raskt vil spore datoer på standardskjemaer:
- Åpne Odoo Studio fra hovedmenyen.
- Gå til skjemaet der feltet trengs.
- Dra et Date-felt fra sidepanelet og slipp det på skjemaet.
- Angi etikett, obligatorisk-status og eventuelt en standardverdi.
- Lagre og lukk Studio.
Feltet får prefikset x_studio_ og legges til skjemaet uten at du trenger database-migrasjon.
Legge til via Python i en modul
For utviklere som bygger moduler, defineres datofelt i Python-modellfiler. Dette er riktig når endringen skal versjonsstyres og rulles ut til flere miljøer:
Eksempel på feltdefinisjon i en salgsmodul:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_customer_requested_date = fields.Date(
string='Kundens ønskede leveringsdato',
index=True,
copy=False,
help='Leveringsdato kunden ønsket ved bestilling.',
)
Etter å ha definert feltet i modellen må du også legge det til i visnings-XML slik at det vises i UI. Odoo oppretter databaskolonnen ved installasjon eller oppgradering av modulen.
Bruke XML-RPC API for programmatisk opprettelse
Hvis du trenger å opprette felt som del av en automatisert deploy eller et konfigurasjonsskript, kan du gjøre det via XML-RPC API-et:
Eksempel på remote opprettelse av et felt via ir.model.fields create-kall:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_customer_requested_date',
'field_description': 'Kundens ønskede leveringsdato',
'model_id': model_id,
'ttype': 'date',
'state': 'manual',
}]
)
ttype for datofeltet skal være 'date' (for DateTime brukes 'datetime'). State 'manual' indikerer at feltet er opprettet utenfor en modulinstallasjon — nyttig ved automatisert konfigurasjon av flere kunder.
Gode fremgangsmåter
1. Bruk Date når tid på dagen er irrelevant
Hvis du bare trenger kalenderdatoen (frister, fødselsdatoer, utløpsdatoer), velg fields.Date. Å bruke DateTime for slike felt introduserer unødvendig kompleksitet og kan føre til off-by-one-dags-feil i ulike tidssoner.
2. Sett meningsfull standard der det passer
For felter som forventet leveringsdato eller oppfølgingsdato gir det ofte mening å defaulte til i dag eller i dag pluss noen dager. I Python bruker du default=fields.Date.today (uten parentes) slik at verdien evalueres ved opprettelse av posten.
3. Indekser datoer som brukes i rapporter og søk
Er feltet ofte brukt i filtrering (forfalte fakturaer, kommende fornyelser, utløpende sertifikater), sett index=True. På store datamengder forbedrer dette ytelsen dramatisk med minimal innsats.
4. Bruk copy=False for datoer som ikke skal kopieres
Datoer som kontraktsstart eller utløpsdato bør ikke kopieres ved duplikering. copy=False tvinger brukeren til å sette ny dato på kopien og unngår stille feil når gamle datoer følger med videre.
5. Legg inn validering ved datointervaller
Når du har et Start- og Slutt-dato-par, legg en @api.constrains-validering som sørger for at slutt ikke er før start. Dette hindrer datakvalitetsproblemer som ellers kan være vanskelige å finne etterpå.
Vanlige fallgruver
Forveksling mellom Date og DateTime
Den vanligste feilen er å bruke DateTime når man egentlig trenger bare dato. DateTime lagres i UTC og konverteres ved visning — det kan gi utslag der en dato skrevet i én tidssone vises som en dag tidligere i en annen. Velg alltid det enkleste feltet som dekker behovet.
Bruk alltid enklest mulig felt som møter forretningskravet.
Å ikke ta hensyn til serverens tidssone i planlagte oppgaver
fields.Date.today() bruker serverens dato i UTC. For mange rapporter er dette greit, men i internasjonale team kan det oppstå en dags avvik for brukere i svært forskjellige tidssoner. Test automasjoner som er tidssoneavhengige fra flere steder hvis teamet er distribuert globalt.
Manglende validering på datopar
Uten en sjekk som sikrer at sluttdato er etter startdato, kan ugyldige kombinasjoner komme inn i systemet. Dette ødelegger beregninger, filtre og rapporter — så legg på en enkel constraints-validering ved behov.
Glemme å indeksere datoer brukt i filtre
Søk som «dato mindre enn i dag» blir full tabellskanning uten indeks. For store tabeller som fakturaer eller oppgaver merkes dette på ytelsen. Indekser er ofte en billig forbedring som gir stor effekt i drift.
Lagre datoer som fritekst (Char)
Noen prøver å bevare et eget format ved å lagre datoer som tekst. Det bryter sortering, filtrering og alle datooperasjoner. Bruk alltid fields.Date — Odoo og databasen tar seg av formatering og lokalisering.
Ofte stilte spørsmål
Hva er forskjellen mellom Date og DateTime i Odoo?
Date lagrer kun kalenderdato (år, måned, dag) uten tid. DateTime inneholder et helt tidsstempel og lagres i UTC, som så omregnes til brukerens tidssone ved visning. Velg Date når tidspunkt ikke er relevant; velg DateTime når presis tid må registreres.
Hvordan setter jeg dagens dato som standard for et datofelt?
I Python: default=fields.Date.today (uten parentes). Dette er en callable som evalueres ved opprettelse av posten. I Odoo Studio velger du «Today» i feltets egenskaper som standardverdi.
Kan jeg beregne et datofelt basert på andre felter?
Ja. Definer feltet med compute='_compute_my_date' og skriv en metode med @api.depends(...) for feltene som skal trigge beregningen. Bruk datetime.date og timedelta for datooperasjoner, og sett store=True hvis resultatet skal lagres i databasen for søk og gruppering.
Hvordan filtrerer jeg poster innen et datointervall i en Odoo-domen?
Bruk vanlige sammenligningsoperatorer i domenet. For eksempel for å finne poster i mars 2026:
[
('x_date_field', '>=', '2026-03-01'),
('x_date_field', '<=', '2026-03-31')
]
Datoer i domener bør alltid være i ISO-format: YYYY-MM-DD.
Kan jeg gjøre et datofelt obligatorisk bare under visse betingelser?
Backend-validering av betinget obligatorisk krever kode. I UI kan du bruke attrs i visnings-XML eller Odoo Studio sine synlighetsregler for å vise felt som «påkrevd» visuelt, men ekte håndheving på serversiden gjøres med en Python @api.constrains-metode.
Oppsummering
Avsluttende tanker om datofeltet
Datofeltet er blant de mest nyttige felttypene i Odoo: enkelt i bruk, lite feilutsatt og kraftig nok til å drive påminnelser, forfallskontroller og tidsbaserte rapporter. Husk å bruke Date når du bare trenger kalenderdager, tenk gjennom standardverdier og indekser, og valider datointervaller der nødvendig.
Å bygge ryddige datamodeller i Odoo starter med små, riktige valg som valg av felttype. Å få dette riktig tidlig er et kjennetegn ved en solid implementasjon — og datofeltet er en grunnstein i det arbeidet.
Om Dasolo Vi i Dasolo hjelper bedrifter med å implementere, tilpasse og optimalisere Odoo i alle avdelinger. Enten du trenger hjelp til å designe datamodeller, legge til skreddersydde felt og arbeidsflyter eller bygge hele moduler, har vi kompetansen du trenger. Ta kontakt — så tar vi en prat om ditt Odoo-prosjekt.