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

Odoo 10计算字段域中指定日期报错,调整代码后求助

解决Odoo 10计算字段日期域报错的问题

先帮你揪出代码里的几个关键问题,这些大概率是导致报错的核心原因:

1. 客户匹配的致命错误

你代码里写的('partner_id', '=', record.name)完全不对!partner_id是关联res.partner模型的字段,存储的是客户的ID(整数类型),而record.name是客户的名称(字符串),用字符串去匹配整数类型的字段,肯定会触发类型不匹配的报错。

如果这个计算字段是在res.partner模型里,正确的匹配应该是('partner_id', '=', record.id);如果是在其他模型(比如sale.order),则要写成('partner_id', '=', record.partner_id.id)。

2. 时间处理的不规范

Odoo有自己的日期处理工具,直接用time.strftime可能会有时区偏移或者格式兼容问题。推荐用Odoo内置的fields.Date.today()来获取当前日期,再用fields.Date.to_string()转换成Odoo字段需要的字符串格式。

3. 变量名冲突

sum是Python的内置函数,把它用作变量名会覆盖内置函数,可能导致后续代码出现奇怪的问题,建议改成total_amount这类自定义名称。


修正后的完整代码示例

假设这个计算字段是在res.partner模型中,修正后的代码如下:

from odoo import models, fields, api

class ResPartner(models.Model):
    _inherit = 'res.partner'

    x_last_order_sum = fields.Float(string='最近订单总额', compute='_compute_last_order_sum')

    @api.multi
    def _compute_last_order_sum(self):
        for record in self:
            # 获取当前日期并转换成Odoo兼容的字符串格式
            today = fields.Date.to_string(fields.Date.today())
            # 核心修正:用客户ID匹配partner_id
            last_confirmed_orders = self.env['sale.order'].search(
                [
                    ('partner_id', '=', record.id),
                    ('date_order', '>=', today)
                ],
                order='date_order desc',
                limit=1000
            )
            total_amount = 0.0
            for order in last_confirmed_orders:
                total_amount += order.amount_total
            record.x_last_order_sum = total_amount

额外的性能优化建议

如果客户的订单数量很多,循环累加的方式会比较慢,推荐用Odoo的read_group方法直接聚合求和,效率更高:

@api.multi
def _compute_last_order_sum(self):
    for record in self:
        today = fields.Date.to_string(fields.Date.today())
        # 用read_group直接计算总额,避免循环订单
        sum_result = self.env['sale.order'].read_group(
            [
                ('partner_id', '=', record.id),
                ('date_order', '>=', today)
            ],
            ['amount_total:sum'],  # 指定对amount_total字段求和
            []  # 不需要分组字段,直接求和
        )
        # 处理空结果的情况
        record.x_last_order_sum = sum_result[0]['amount_total'] if sum_result else 0.0

内容的提问来源于stack exchange,提问作者Pelingier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:33:14