Introduktion
Om du någonsin har öppnat en försäljningsorder, en projektuppgift eller en tillverkningsorder i Odoo, har du redan använt ett datumfält. Deadlines, leveransdatum, förfallodatum för fakturor, startdatum för kontrakt - det mesta av den tidskänsliga informationen i Odoo lagras med hjälp av denna fälttyp.
För affärsanvändare är datumfält intuitiva: du klickar, en kalender dyker upp, du väljer ett datum. Men det finns mer som pågår under ytan. Att förstå hur datumfältet fungerar i Odoo-datamodellen, hur det skiljer sig från DateTime-fält och hur man skapar eller anpassar det kommer att hjälpa dig att bygga mer exakta arbetsflöden och undvika de tidszonsöverraskningar som snubblar många Odoo-implementationer.
Denna guide täcker allt du behöver veta om datumfältet i Odoo, från vad det lagrar till hur du använder det effektivt i dina affärsprocesser.
Vad är datumfältet i Odoo
I Odoo ORM är fields.Date typen utformad för att lagra kalenderdatum utan tidskomponent. Ett datum som "2026-03-06" lagras exakt som det är, utan timmar, minuter eller sekunder kopplade.
I PostgreSQL, databasen som Odoo kör på, motsvarar ett datumfält DATE kolumntypen. Detta skiljer sig från DateTime-fältet, som motsvarar TIMESTAMP och inkluderar en fullständig tidsstämpel ner till sekunden.
I användargränssnittet visas ett datumfält som en textinmatning med en kalenderplockare. Användare kan antingen skriva in ett datum direkt eller klicka på kalenderikonen för att välja ett. I listvyer visas det som formaterad text anpassad till användarens lokala inställningar.
Så här ser en definition av ett datumfält ut i en anpassad Python-modul:
from odoo import fields, models
class ProjectTask(models.Model):
_inherit = 'project.task'
x_deadline_confirmed = fields.Date(
string='Bekräftad Deadline',
help='Den officiellt bekräftade deadline som överenskommits med kunden.',
)
I Odoo Studio är detta fält helt enkelt märkt Datum. När det skapas genom Studio får det automatiskt ett x_studio_ prefix. När det skapas via Python-kod eller XML-RPC API väljer du det tekniska namnet själv.
Hur fältet fungerar
Datum vs. DateTime: vad förändras egentligen
Det viktigaste att förstå om datumfältet är vad det inte inkluderar: tid. Det finns inga timmar, inga tidszonskonverteringar, inget utöver kalenderdatumet självt.
DateTime-fältet, å sin sida, lagrar en fullständig tidsstämpel och sparas i UTC i databasen. Odoo konverterar det sedan till användarens lokala tidszon vid visning. Detta är källan till många förvirrande "mitt datum flyttades med en dag"-buggar som team stöter på. Dessa är nästan alltid DateTime-problem, inte datumfältsproblem.
När du använder ett datumfält är det du lagrar exakt vad användarna ser. Ett värde av 2026-03-15 är 2026-03-15 för varje användare, oavsett var i världen de befinner sig.
Nyckelfältsattribut
Här är de viktigaste egenskaperna du kan konfigurera på ett Datumfält i Odoo-ramverket:
- required: Gör fältet obligatoriskt både på gränssnittsnivå och modellnivå.
- default: Ställer in ett automatiskt standardvärde. Till exempel,
fields.Date.todayhar dagens datum som standard på nya poster. - index: Skapar ett databasindex för snabbare filtrering och sökning på det fältet.
- compute: Kopplar en Python-metod som beräknar värdet dynamiskt.
- store: När den kombineras med
compute, sparar det det beräknade värdet i databasen. - readonly: Förhindrar användare från att redigera fältet direkt i gränssnittet.
- copy: Kontrollerar om värdet överförs när en post dupliceras. Standard är
True.
Hur det visas i vyer
I formulärvyer renderas ett Datumfält som en textinmatning med en kalenderpopup. I listvyer visas det som formaterad text. I sökvyer stöder det datumintervallfilter direkt: "denna vecka", "denna månad", "detta kvartal", samt exakta jämförelseoperatorer som före, efter och på ett specifikt datum.
Visningsformatet följer användarens språkinställningar i Odoo. En amerikansk användare ser MM/DD/YYYY medan en europeisk användare ser DD/MM/YYYY. Det underliggande lagrade värdet är alltid i ISO-format (YYYY-MM-DD), oavsett hur det visas på skärmen.
Interaktion med Odoo ORM
När du läser ett datumfält i koden returnerar Odoo ORM ett Python datetime.date objekt, eller False om fältet är tomt. När du skriver genom ORM kan du skicka antingen ett datetime.date objekt eller en sträng i "YYYY-MM-DD" format. Genom XML-RPC API:n skickas och tas datum alltid emot som strängar.
Det finns inga komplexa transformationer involverade när man arbetar med datumfält i Odoo datamodell. Ramverket hanterar formatering och lagring automatiskt, vilket är en del av vad som gör denna fälttyp så praktisk för dagligt bruk i Odoo-utveckling.
Affärsanvändningsfall
Datumfältet förekommer i nästan varje del av en Odoo-implementation. Här är fem praktiska exempel från verkliga affärsarbetsflöden.
CRM: Kontraktets Start- och Slutdatum
I försäljningsteam som använder Odoo CRM har kontrakt ofta definierade start- och slutdatum. Ett datumfält på leaden eller en anpassad kontraktsmodell gör det enkelt att spåra när affärer aktiveras och när de löper ut.
I kombination med automatiserade åtgärder kan du utlösa e-postpåminnelser eller statusändringar när ett kontrakt närmar sig sitt slutdatum, utan någon manuell uppföljning från teamet. Denna typ av automatisering är enkel att ställa in och sparar många missade förnyelser över tid.
Försäljning: Begärda Leveransdatum
Kunder begär ofta ett specifikt leveransdatum när de lägger beställningar. Många företag lägger till ett "Kundbegärt Datum" datumfält på försäljningsorder för att ge operationsteamet ett tydligt mål att planera kring.
Att använda ett datumfält istället för DateTime håller datan enkel och undviker tidszonsförvirring under lagerkoordinering. Lagerteamet ser samma datum som försäljningsteamet angav, utan risk för konverteringsproblem.
Lager: Utgångsdatum på Partier
Inom livsmedels-, läkemedels- och kemikalieindustrin behöver produktpartier spåras med utgångsdatum på lager nivå. Odoos partihantering använder datumfält för att lagra utgångs- och bäst-före-datum på stock.lot.
Dessa driver FEFO (First Expired First Out) plockstrategier och automatiserade varningar när lager närmar sig utgång, vilket skyddar både regulatorisk efterlevnad och produktkvalitet utan att kräva manuella kontroller.
Bokföring: Fakturaförfallodagar
Fakturaförfallodagar i Odoo är datumfält. De bestämmer när automatiska betalningspåminnelser skickas, hur förfallna fakturor identifieras och hur rapporterna för åldrade leverantörsskulder och kundfordringar beräknas.
Att få dessa datum rätt är en av de mest operativt viktiga användningarna av datumfältet i hela Odoo-datamodellen. Ett felaktigt förfallodatum bryter tyst spårningen av kassaflöde och automatiseringen av uppföljning.
HR: Onboarding, Kontrakt och Certifieringsdatum
HR-team förlitar sig starkt på datumfält för anställningsdatum, slutdatum för provanställning, kontraktsstart- och slutdatum samt certifieringsutgångsdatum. Dessa värden matas in i automatiserade e-postmeddelanden, varningar och regler för löneberäkning.
Ett välutformat HR-modul i Odoo är omöjligt utan rena, korrekta datumfältsdata i anställdas register. Dessa datum är ofta utlösarna för några av de mest affärskritiska automatiseringarna i en Odoo-installation.
Skapa eller Anpassa Datumfältet
Det finns tre huvudsakliga sätt att lägga till ett datumfält i en Odoo-modell, beroende på din tekniska konfiguration och distributionsmetod.
Använda Odoo Studio (Ingen kod)
Odoo Studio är det enklaste sättet att lägga till ett datumfält utan att skriva någon kod. Detta är den rekommenderade metoden för affärsanvändare och konsulter som snabbt vill lägga till datumspårning till standard Odoo-formulär:
- Öppna Odoo Studio från huvudmenyn.
- Navigera till det formulär där du vill ha fältet.
- Dra ett Datum fält från sidofältet till formuläret.
- Ställ in etiketten, obligatorisk status och ett standardvärde om det behövs.
- Spara och stäng Studio.
Studio skapar fältet med ett x_studio_ prefix och lägger till det i formulärvyn omedelbart. Ingen databasöverföring behövs från din sida.
Använda Python i en Anpassad Modul
För utvecklare som bygger Odoo-moduler definieras Datumfält i Python-modellfiler. Detta är rätt tillvägagångssätt för alla anpassningar som behöver versionskontrolleras och distribueras över flera miljöer:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_customer_requested_date = fields.Date(
string='Kundens begärda datum',
index=True,
copy=False,
help='Leveransdatum begärt av kunden vid beställningstillfället.',
)
Efter att ha lagt till fältet i modellen måste du också lägga till det i den relevanta vy XML-filen så att det visas i gränssnittet. Odoo hanterar skapandet av databas kolumnen när du installerar eller uppgraderar modulen.
Använda XML-RPC API
För programmatisk fält skapelse som en del av en distributionspipeline eller en fjärrkonfigurationsnotebook kan du skapa Datumfält via Odoo XML-RPC API:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_customer_requested_date',
'field_description': 'Kundens begärda datum',
'model_id': model_id,
'ttype': 'date',
'state': 'manual',
}]
)
Värdet för ttype för ett Datumfält är 'date'. För ett DatumTid fält skulle det vara 'datetime'. Att använda 'manual' som tillstånd berättar för Odoo att detta fält skapades manuellt, inte genom en modulinstallation. Så här hanterar Dasolo fjärrfält skapelse för kunder som en del av automatiserade konfigurationsskript.
Bästa praxis
1. Använd Datum, inte DatumTid, när tid är irrelevant
Om det enda som betyder något är kalenderdatumet (en deadline, ett kontraktsdatum, ett födelsedatum, ett utgångsdatum), använd fields.Date. Att välja DatumTid för rent datumbaserad data lägger till tidszonskomplexitet utan praktisk nytta och kan orsaka förvirrande fel med en dags avvikelse beroende på serverns tidszonskonfiguration.
2. Ställ in ett meningsfullt standardvärde när det är rimligt
För fält som "Förväntat Leveransdatum" eller "Uppföljningsdatum", ger det en rimlig utgångspunkt att som standard använda idag eller idag plus ett antal dagar. Använd default=fields.Date.today utan parenteser för ett dynamiskt standardvärde som utvärderas vid skapandet av posten, inte vid klassdefinitionstid.
3. Indexera datumfält som används i rapporter och sökfilter
Om dina användare regelbundet filtrerar poster efter ett datumfält (förfallna fakturor, kommande förnyelser, utgående certifieringar), lägg till index=True. På stora dataset förbättrar detta dramatiskt filter- och rapportprestanda. Det är en liten förändring med en betydande påverkan i stor skala och kostar nästan ingenting att implementera i förväg.
4. Använd copy=False för datum som inte ska överföras
Datum som "Kontraktsstartdatum" eller "Utgångsdatum" bör inte kopieras när en användare duplicerar en post. Att lägga till copy=False tvingar användaren att ange datumet uttryckligen på den nya posten, vilket undviker tysta fel där ett föråldrat datum kvarstår på ett duplicerat kontrakt eller projektuppgift.
5. Lägg till begränsningar när två datumfält bildar ett intervall
När en modell har ett "Startdatum" och "Slutdatum"-par, lägg till en Python-begränsning med @api.constrains för att säkerställa att slutdatumet inte är före startdatumet. Detta är enkelt att implementera och förhindrar en hel kategori av datakvalitetsproblem som är irriterande att diagnostisera i efterhand.
Vanliga fallgropar
Förvirrande Datum och DatumTid-fält
Detta är det vanligaste misstaget när man arbetar med tidskänslig data i Odoo. DatumTid lagrar en fullständig tidsstämpel i UTC och konverterar vid visning. Datum lagrar endast kalenderdatumet utan konvertering. Att använda DatumTid när du bara behöver ett datum leder till tidszonsproblem: ett datum som anges som 15 mars i en UTC+2-miljö kan visas som 14 mars för en UTC-5-användare.
Använd alltid den enklaste fälttypen som uppfyller ditt faktiska affärsbehov.
Att inte ta hänsyn till serverns tidszon i schemalagda åtgärder
När du bygger schemalagda åtgärder eller rapporter som filtrerar på ett datumfält i förhållande till "idag", var medveten om att fields.Date.today() returnerar serverdatumet i UTC. För de flesta rapporteringsanvändningar är detta okej, men det kan orsaka en dags avvikelse för team i tidszoner som skiljer sig avsevärt från servern. Testa datumberoende automatiseringar från flera tidszoner om ditt team är globalt distribuerat.
Saknade begränsningar på datumintervallpar
Det är vanligt att se implementationer där "Startdatum" och "Slutdatum" finns som separata fält men ingen validering säkerställer att slutdatumet är efter startdatumet. Detta låter ogiltiga data komma in i systemet tyst, vilket bryter beräkningar av varaktighet, filtreringsresultat och rapporter. Lägg alltid till en @api.constrains-kontroll när två datum bildar ett logiskt intervall.
Att glömma att indexera datumfält som används i filter
Datumfält som används i "förfallna" kontroller, "kommande deadlines" vyer eller rapporter om åldrad balans frågas typiskt med jämförelser som "datum mindre än idag". Utan ett index är varje sådan fråga en fullständig tabellskanning. På modeller med stora postantal som fakturor, uppgifter eller lagerflyttningar, saktar saknade index på datumfält ner dagliga operationer märkbart över tid.
Att lagra datum som Char-fält
Vissa team lagrar datum som textsträngar i Char-fält för att bevara ett anpassat format eller undvika datumväljaren. Detta bryter helt sortering, filtrering, datumaritmetik och rapportering. Använd alltid rätt fields.Date-typ. Odoo-ramverket och databasen hanterar formatering och lokalisering automatiskt, så det finns ingen praktisk anledning att lagra datum som ren text.
FAQ
Vad är skillnaden mellan ett datumfält och ett datumtidfält i Odoo?
Ett datumfält lagrar endast ett kalenderdatum (år, månad, dag) utan tidskomponent. Ett datumtidfält lagrar en fullständig tidsstämpel inklusive timmar, minuter och sekunder, sparad i UTC och visad i användarens lokala tidszon. Använd datum när tidpunkten på dagen är irrelevant för affärsprocessen. Använd datumtid när du behöver spåra exakt när något hände.
Hur ställer jag in dagens datum som standard för ett datumfält?
I Python, använd default=fields.Date.today utan parenteser. Detta är en anropbar funktion som Odoo utvärderar vid registreringstillfället, så standardvärdet är alltid det aktuella datumet snarare än ett fast datum inbakat vid klassdefinitionen. I Odoo Studio, välj "Idag" som standardvärde i fältets egenskapspanel.
Kan jag beräkna ett datumfält baserat på andra fältvärden?
Ja. Definiera fältet med compute='_compute_my_date' och skriv en metod dekorerad med @api.depends() som listar de fält som utlöser omberäkning. Inuti metoden, utför datumberäkningar med Pythons datetime.date eller timedelta. Lägg till store=True om du vill att resultatet ska sparas i databasen för användning i sökfilter, gruppering och exporter.
Hur filtrerar jag poster efter ett datumbaserat intervall i en Odoo-domän?
Använd standardjämförelseoperatörer i domänen. Till exempel, för att hitta poster där datumfältet faller inom mars 2026:
[
('x_date_field', '>=', '2026-03-01'),
('x_date_field', '<=', '2026-03-31')
]
Datumsträngar i domäner bör alltid vara i ISO-format: ÅÅÅÅ-MM-DD.
Kan jag göra ett datumfält obligatoriskt endast under vissa förhållanden?
Standard Odoo tvingar inte villkorliga obligatoriska fält på backend utan kod. Du kan använda attrs i vy-XML för att visuellt markera ett fält som obligatoriskt baserat på andra värden, men verklig backend-tillämpning kräver en Python-begränsning med @api.constrains. För enkla fall ger Odoo Studios villkorliga synlighetsregler ett praktiskt substitut utan att skriva kod.
Slutsats
Datumfältet är en av de mest praktiska fälttyperna i Odoo-ramverket. Det är enkelt att förstå, lätt att använda och tillräckligt kraftfullt för att driva viktig affärslogik som påminnelser, förfallna kontroller och tidskänslig rapportering.
De viktigaste sakerna att ta med sig: använd Datum istället för DatumTid när du bara behöver ett kalenderdatum, förstå hur standardvärden och index förbättrar användbarhet och prestanda, och lägg alltid till begränsningar när två datumfält definierar ett intervall.
Att bygga rena, väl utformade datamodeller i Odoo börjar med små beslut som att välja rätt fälttyp. Att få dessa rätt från början är ett av kännetecknen för en solid Odoo-implementering, och datumfältet är en grundläggande del av den pusselbiten.
På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo över alla avdelningar och affärsprocesser. Oavsett om du behöver hjälp med att utforma en ren datamodell, lägga till anpassade fält och arbetsflöden, eller bygga en fullständig Odoo-modul från grunden, så finns vårt team här för att hjälpa till. Kontakta oss och låt oss prata om ditt Odoo-projekt.