python - (自动操作)Odoo 的 write() 问题并执行 for 循环
问题描述
我正在尝试使用自动操作更新模型“product.supplierinfo”中的“序列”值,以便在从采购订单更新供应商的价格时,优先考虑该供应商来计算补货成本。为此,新的/更新的记录必须获得该产品的最低“序列”值。
自动操作设置:模型:product.supplierinfo 操作:执行 Python 代码条件:创建和更新
这部分py成功重置了从2开始的序列:
val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id)], order = "sequence asc")
for reg in registers:
val = val + 1
reg['sequence'] = val
而这另一个成功地为更新/新行提供了序列值 1:
record.write({'sequence': 1})
但是,将所有行放在一起时,所有行都会得到序列 1:
val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id)], order = "sequence asc")
for reg in registers:
val = val + 1
reg['sequence'] = val
record.write({'sequence': 1})
由于我很菜鸟,我什至认为循环可能不会以缩进结束并尝试另一个以证明我遗漏了一些东西(首先将序列 1 设置为目标记录,然后从搜索中删除该记录方法)。它仍然在所有寄存器的序列值上得到 1:
record.write({'sequence': 1})
val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id),('id','!=', record.id)], order = "sequence asc")
for reg in registers:
val = val + 1
reg['sequence'] = val
知道为什么它不设置触发记录的序列 1,然后从 2 开始设置其余部分吗?
解决方案
在@CZoellner 的帮助下,我们发现我的代码正在创建一个遍历所有记录的循环,当编辑序列值时,它会再次触发自动操作。由于某种原因,它不会引发无限循环错误。
但是,成功的解决方案是检查write.date
记录组的最大值,以验证自动化操作是否已经通过它。
最终的工作代码是:
val = 1
fmt = '%Y-%m-%d %H:%M:%S'
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
d2 = datetime.datetime.strptime(now, fmt)
registers = env['product.supplierinfo'].search([('product_tmpl_id','=',record.product_tmpl_id.id),('id','!=', record.id)], order = "sequence asc")
maxi = max(reg.write_date for reg in registers)
d1 = datetime.datetime.strptime(maxi, fmt)
diff = (d2-d1).seconds
if diff > 1:
for reg in registers:
val = val + 1
reg['sequence'] = val
record.write({'sequence': 1})
感谢@CZoellner 的合作
推荐阅读
- android - ExposedDropdownMenu 中的字符串以外的其他对象
- javascript - 使用highchart在柱形图中获取一系列的一系列
- python-3.x - 如何在 Python 中将毫秒转换为具有小时、分钟和秒的格式?(超过 24 小时)
- node.js - 引擎“节点”与此模块不兼容。预期版本“12.x”。得到“14.8.0”
- azure - 通过 Azure DevOps 将多个应用程序部署到同一个 Azure Web 应用程序
- azure - 在 botframework-sdk 中,我的机器人突然开始出现此错误错误:获取令牌请求返回 http 错误:401
- javascript - 开玩笑的 copyFile 和 stat 函数没有被调用
- python - 当两个单词仅设置为单独的“TEXT”条件对象时,spacy 匹配器返回正确答案。为什么?
- java - 生成的 SQL 中的 WHERE 错误附近的语法不正确
- php - 开启,而第一项将具有不同的类别