You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:20:30