如何在Odoo模块中将日期转换为指定格式的字符串?
Odoo自动日期字段转yyyymmddhhmmss格式计算字段解决方案
刚接触Odoo的话,处理日期格式转换其实挺直观的,我帮你拆解一下步骤,直接上代码和解释:
1. 先搞定自动填充的日期字段
首先要注意:如果你的需求是要包含时分秒的格式,建议用Datetime类型字段(Date类型只有年月日,转出来的时分秒会是000000)。自动填充可以直接用Odoo内置的默认值:
from odoo import models, fields, api class YourModel(models.Model): _name = 'your.model.name' # 替换成你的实际模型名 _description = 'Your Model Description' # 自动填充当前日期时间的字段 auto_datetime = fields.Datetime( string='自动日期时间', default=fields.Datetime.now, # 自动填充当前UTC时间 required=True )
如果确实只需要纯日期(不带时分秒),可以改成:
auto_date = fields.Date( string='自动日期', default=fields.Date.today, required=True )
2. 添加计算字段转换格式
接下来定义一个计算字段,把上面的日期/时间转成yyyymmddhhmmss格式的字符串。这里用Char类型就足够了:
针对Datetime字段的情况
# 格式化后的日期字段(可选store=True将结果存到数据库) formatted_datetime = fields.Char( string='格式化日期时间', compute='_compute_formatted_datetime', store=True # 若需持久化到数据库则开启,否则每次访问实时计算 ) @api.depends('auto_datetime') # 依赖自动日期字段,字段变化时自动重新计算 def _compute_formatted_datetime(self): for record in self: if record.auto_datetime: # 用strftime把datetime对象转成指定格式 # %Y=4位年, %m=2位月, %d=2位日, %H=24小时制, %M=分, %S=秒 record.formatted_datetime = record.auto_datetime.strftime('%Y%m%d%H%M%S') else: record.formatted_datetime = False
针对Date字段的情况
如果用的是Date类型,需要先把它转成Datetime对象再格式化(时分秒会默认是000000):
formatted_date = fields.Char( string='格式化日期', compute='_compute_formatted_date', store=True ) @api.depends('auto_date') def _compute_formatted_date(self): for record in self: if record.auto_date: # 把Date转成Datetime对象 dt = fields.Datetime.from_string(record.auto_date) record.formatted_date = dt.strftime('%Y%m%d%H%M%S') else: record.formatted_date = False
3. 额外注意点
- 时区问题:Odoo默认存储的是UTC时间,如果需要转换为当前用户的时区时间再格式化,可以用
context_timestamp:local_dt = fields.Datetime.context_timestamp(self, record.auto_datetime) record.formatted_datetime = local_dt.strftime('%Y%m%d%H%M%S') - store=True的作用:开启后计算结果会存在数据库里,适合需要频繁查询或报表使用的场景;关闭则每次访问实时计算,节省存储但略耗性能。
内容的提问来源于stack exchange,提问作者TheRedosan
相关产品推荐
相关产品推荐

