首页 > 解决方案 > (自动操作)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 开始设置其余部分吗?

标签: pythonodooodoo-11

解决方案


在@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 的合作


推荐阅读