(自动操作)write()和do for循环的Odoo问题

2024-10-04 17:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用自动操作更新模型“product.supplierinfo”中的“sequence”值,以便在根据采购订单更新供应商的价格时,该供应商优先计算补货成本。为了实现这一点,新的/更新的记录必须获得该产品的最低“序列”值

Automated Action Screenshoot

自动操作设置: 型号: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开始设置其余的吗


Tags: idforsearchmodel记录order序列val
1条回答
网友
1楼 · 发布于 2024-10-04 17:25:16

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

相关问题 更多 >

    热门问题