浅谈eval 在odoo模板(py3o)中的妙用 (本例是在odoo12下的py3o环境中用libreoffice7测试通过)

发布时间 2023-10-17 15:36:56作者: *感悟人生*
${eval("env['ss.purchase.exchange.rate'].search([('currency_id', '=', 'USD'), ('crawler_day', '=', datetime.datetime(object.delivery_order_id.ATD.year, object.delivery_order_id.ATD.month, 1).strftime('%Y.%m.%d'))], limit=1).rate or None", {'env': objects.env, 'object': object, 'datetime': __import__('datetime')})}

这段代码是在使用 eval 函数执行一个表达式,该表达式在 Odoo 的环境中搜索 'ss.purchase.exchange.rate' 模型的记录。

搜索的条件是 currency_id 字段等于 'USD',并且 crawler_day 字段等于给定的日期。给定的日期是 object.delivery_order_id.ATD 的年、月和第一天,格式化为 YYYY.MM.DD 格式。

如果找到匹配的记录,就返回该记录的 rate 字段的值,否则返回 None。

翻译成人话: 查询给定日期中,所在月份的第一天,也就是查询日期所在月的第一天。如果找到记录则返回,否则返回None

下面是这段代码的详细解释:

- eval 是 Python 的内置函数,用于执行字符串形式的表达式,并返回结果。
- "env['ss.purchase.exchange.rate'].search([('currency_id', '=', 'USD'), ('crawler_day', '=', datetime.datetime(object.delivery_order_id.ATD.year, object.delivery_order_id.ATD.month, 1).strftime('%Y.%m.%d'))], limit=1).rate or None" 是要执行的表达式,它是一个字符串。
- {'env': objects.env, 'object': object, 'datetime': __import__('datetime')} 是 eval 函数的第三个参数,它是一个字典,定义了表达式中可以使用的变量。


- env['ss.purchase.exchange.rate'].search([('currency_id', '=', 'USD'), ('crawler_day', '=', datetime.datetime(object.delivery_order_id.ATD.year, object.delivery_order_id.ATD.month, 1).strftime('%Y.%m.%d'))], limit=1) 是在 Odoo 的环境中搜索 'ss.purchase.exchange.rate' 模型的记录,搜索条件是 currency_id 字段等于 'USD',并且 crawler_day 字段等于给定的日期。
- datetime.datetime(object.delivery_order_id.ATD.year, object.delivery_order_id.ATD.month, 1).strftime('%Y.%m.%d') 是将 object.delivery_order_id.ATD 的年、月和第一天格式化为 YYYY.MM.DD 格式的日期。
- .rate or None 是获取搜索到的记录的 rate 字段的值,如果没有找到记录,就返回 None。