You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按条件更新每条记录?解决Odoo中search_read更新报错问题

问题原因及解决方案

错误原因

你使用的search_read()方法返回的是字典列表,并非Odoo的ORM记录集对象。字典只能通过键值对['price']访问数据,但即便拿到值,也无法直接通过修改字典来更新数据库——因为字典只是数据库数据的副本,不是记录的引用,这才导致了'dict' object has no attribute 'price'的报错。

正确实现方式

方法1:用ORM记录集批量更新(推荐)

直接通过search()获取符合条件的记录集,再用write()批量更新,这是Odoo中最规范高效的写法:

# 筛选出所有价格为0的价目表项记录
price_list_items = self.env['product.pricelist.item'].search([('price', '=', 0)])
# 批量更新价格为100
price_list_items.write({'price': 100})

这种方式的优势:

  • 减少数据库交互次数,批量操作性能远高于逐条修改
  • 代码简洁,完全符合Odoo ORM的设计逻辑

方法2:用search_read配合browse修改(不推荐,仅作参考)

如果一定要用search_read,需要先拿到记录ID,再通过browse()获取真实的记录集对象来修改:

# 只读取需要的id字段,减少不必要的数据传输
for item_data in self.env['product.pricelist.item'].search_read([('price', '=', 0)], ['id']):
    # 通过id获取对应的记录集
    item_record = self.env['product.pricelist.item'].browse(item_data['id'])
    # 执行价格更新
    item_record.write({'price': 100})

注意事项

  • 确保当前执行代码的用户拥有product.pricelist.item模型的读、写权限,否则会触发权限错误
  • 多公司环境下,注意检查记录的company_id是否符合当前环境的公司过滤规则

内容的提问来源于stack exchange,提问作者Selman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:40:32