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

Odoo动态设置Many2many字段报错:'list'对象无'get'属性

问题原因&修正方案

为啥会报错?

  • 字段定义时直接把onchange方法绑到domain参数上,这是错误用法——Odoo字段的domain只能接受域表达式,或者返回域表达式的普通函数,不能用onchange方法。
  • onchange方法的返回格式错了,必须返回包含domain键的字典(结构是{'domain': {'目标字段名': 域列表}}),你直接返回列表,系统就会触发'list' object has no attribute 'get'的错误。
  • 搜索条件里('id','!=','1')是拿字符串和整数ID对比,类型不匹配,筛选逻辑根本不生效,得改成整数1。
  • 没处理query为空的情况,要是查不到数据,domain就没定义,直接报错。

修正后的代码

allowed_economic_activity_ids = fields.Many2many(
    'izi.economic.activity', 
    string='Allowed Economic Activities'
)

@api.onchange('allowed_economic_activity_ids', 'invoice_line_ids')
def _filtrar_actividades(self):
    # 筛选掉ID为1的经济活动记录
    query = self.env['izi.economic.activity'].search([('id', '!=', 1)])
    # 构造可选域:如果有结果就用筛选后的ID集合,否则为空列表
    domain = [('id', 'in', query.ids)] if query else []
    # 返回标准格式的onchange响应,指定要更新域的字段
    return {'domain': {'allowed_economic_activity_ids': domain}}

关键改动说明

  • 字段定义里去掉了错误的domain绑定,改成通过onchange动态设置可选域。
  • onchange方法返回符合Odoo要求的字典格式,明确指定要修改域的字段名。
  • 把搜索条件里的字符串'1'改成整数1,确保筛选逻辑正确。
  • 加了兜底处理,就算query为空也不会触发未定义变量的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:22:19