You need to enable JavaScript to run this app. Odoo中借助Search ORM实现from_date、to_date与date_order的日期范围比对
优惠活动
大模型
产品
解决方案
定价
更多

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官方推荐的标准写法:

  1. 先导入依赖工具类:
    from odoo.fields import Date, Datetime
    from datetime import timedelta
    
  2. 改写查询逻辑:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.12 14:15:04