Odoo中借助Search ORM实现from_date、to_date与date_order的日期范围比对
Odoo ORM中Datetime字段与Date类型入参的范围匹配实现
问题根因
当前写法无法匹配到正确数据的核心原因:sale.order的date_order是Datetime类型,存储值为带时分秒的UTC时间格式,而自定义的from_date/to_date是纯Date类型,直接做等值匹配只会命中对应日期0点整的订单,完全无法覆盖当天所有带时分秒的交易记录。
推荐实现方案(性能最优,可走数据库索引)
不需要对date_order字段做函数截取,直接将Date类型的入参转换为Datetime类型的查询边界,从根上避免字段转换带来的索引失效问题,是Odoo官方推荐的标准写法:
- 先导入依赖工具类:
from odoo.fields import Date, Datetime from datetime import timedelta - 改写查询逻辑:
def update_commission(self): sale_br = self.env['sale.order'] # 转换起始边界:from_date对应日期的本地0点,自动处理时区转换为UTC时间 start_datetime = Datetime.to_datetime(self.from_date) # 转换结束边界:to_date对应日期的次日0点,用小于判断可自动覆盖to_date当天全时段的所有时间值 end_datetime = Datetime.to_datetime(self.to_date + timedelta(days=1)) # 范围查询条件 sale_sr = sale_br.search([ ('date_order', '>=', start_datetime), ('date_order', '<', end_datetime) ])
注意事项
- 你当前自定义字段的
default="Today"写法存在问题:Odoo中Date类型字段的动态默认值不能直接传字符串,需要写成default=fields.Date.today,否则系统会把"Today"当成固定的字符串值存储,无法实现默认取当天的效果 - 不要手动拼接字符串格式的时间值做比对,一定要使用Odoo提供的
Datetime工具类做转换,可自动处理时区偏差,避免因为用户时区不同导致的筛选错位 - 不要使用截取数据库字段日期的方式做查询(比如在domain里用模糊匹配比对date_order、或者调用SQL级别的日期截取函数),这类写法会让
date_order字段的数据库索引失效,当订单量较大时会出现明显的查询性能问题 - 不要用
<=搭配手动减1秒凑当天结束时间的写法,这种写法会漏掉存储了毫秒值的时间记录,用次日0点做小于判断可以无遗漏覆盖当天全时段
内容的提问来源于stack exchange,提问作者Dave Max
相关产品推荐
相关产品推荐

