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
相关产品推荐
相关产品推荐

