Odoo中获取销售订单日期与金额字段值转为文本展示的问题
Odoo 自定义模型获取销售订单字段并格式化显示解决方案
问题分析
你当前的test字段应该是直接关联了sale.order的name字段(订单编号),需要调整字段定义或计算逻辑,从关联的销售订单中提取amount_total和date_order并格式化为文本展示。
解决方案
假设你的自定义模型已经通过Many2one字段关联了sale.order(比如字段名为sale_order_id),以下提供两种可行实现方式:
方式1:使用计算字段(推荐)
通过compute方法动态获取并格式化字段值,适合需要实时同步销售订单数据的场景:
from odoo import models, fields, api from odoo.tools import float_round, format_datetime class CustomModel(models.Model): _name = 'custom.model' _description = '自定义模型' sale_order_id = fields.Many2one('sale.order', string='关联销售订单') test = fields.Char(string='订单信息', compute='_compute_order_info', store=True) @api.depends('sale_order_id.amount_total', 'sale_order_id.date_order') def _compute_order_info(self): for record in self: if record.sale_order_id: # 格式化金额(保留2位小数,可按需调整精度) formatted_amount = str(float_round(record.sale_order_id.amount_total, precision_digits=2)) # 格式化日期时间(自动适配用户时区,可自定义格式字符串) formatted_date = format_datetime(self.env, record.sale_order_id.date_order, tz=self.env.user.tz) # 组合成最终展示文本 record.test = f"订单金额:{formatted_amount} | 下单日期:{formatted_date}" else: record.test = ''
- 说明:
store=True会将计算结果存储到数据库,若不需要持久化存储可去掉;format_datetime自动处理时区问题,保证显示时间和用户时区一致。
方式2:关联字段+计算字段组合
如果需要单独保留原始字段值,可先通过related获取销售订单的原始字段,再计算组合:
class CustomModel(models.Model): _name = 'custom.model' _description = '自定义模型' sale_order_id = fields.Many2one('sale.order', string='关联销售订单') related_amount = fields.Monetary(related='sale_order_id.amount_total', string='关联订单金额', readonly=True) related_date = fields.Datetime(related='sale_order_id.date_order', string='关联下单日期', readonly=True) test = fields.Char(string='订单信息', compute='_compute_order_info') @api.depends('related_amount', 'related_date') def _compute_order_info(self): for record in self: if record.related_amount and record.related_date: formatted_amount = str(record.related_amount) formatted_date = record.related_date.strftime('%Y-%m-%d %H:%M') record.test = f"金额:{formatted_amount} | 日期:{formatted_date}" else: record.test = '无关联订单'
常见问题排查
- 确保自定义模型的
sale_order_id字段已正确关联sale.order模型,且在视图中添加该字段用于选择订单 - 检查计算方法的
depends装饰器是否包含amount_total和date_order,否则字段不会随销售订单数据更新自动刷新 - 若使用
store=True,首次关联订单后需重新保存记录触发计算,确保数据写入数据库
内容的提问来源于stack exchange,提问作者Dmitri_V
相关产品推荐
相关产品推荐

