关于many2one的domain问题
-
有两个many2one字段,类似于省市的两级联动,如下:
province_id = fields.Many2one('模型1', string='省') city_id = fields.Many2one('模型2', string='市')
目前的需求是根据省province_id的值,动态筛选市city_id显示的值。
根据网上的说法,我用了以下onchange函数@api.onchange('province_id') def _onchange_city(self): # 取对应的省的值 province_value = self.province_id .province # 将取到的值跟模型2中市对应的省值进行比较匹配 area_id_list = [] for record in self.env['模型2'].search([('city_id.省的值', '=', province_value)]).ids: area_id_list.append(record) # 用列表中的id去筛选,符合的留下 domain = {'city_id ': [('id', 'in', area_id_list)]} return {'domain': domain}
最后得出来的效果跟odoo13中公司的国家和省的字段选择是一样的,如图:
但是出现了一个问题:在第一次编辑时选择了国家--“中国”,然后退出此记录再进去编辑时,省的选择会变成全部而不是在属于中国的省里进行筛选,如图:
想要询问的是,有没有办法在第二次进入以后,省的选择能通过国家的字段值进行筛选后显示,或者有类似的解决办法。
非常感谢大家! -
@阿巴阿巴 用onchange方法返回domain的办法来过滤另一个Many2X的列表的确有楼主所描述的问题。
其实你所描述的问题,只要
模型2
上有指向模型1
的Many2one
字段(比如:province_id
,就可以直接在city_id
字段上添加domain来获得需要的效果:city_id = fields.Many2one("模型2", string='市', domain="[('province_id', '=?', province_id)]")
注意:domain中带引号的
'province_id'
表示你模型2
上的字段,而后面的没有引号的字段province_id
表示当前对象上的字段。另外,要了解一下,onchange方法会逐渐被compute方法所取代。
-
@阿巴阿巴 用onchange方法返回domain的办法来过滤另一个Many2X的列表的确有楼主所描述的问题。
其实你所描述的问题,只要
模型2
上有指向模型1
的Many2one
字段(比如:province_id
,就可以直接在city_id
字段上添加domain来获得需要的效果:city_id = fields.Many2one("模型2", string='市', domain="[('province_id', '=?', province_id)]")
注意:domain中带引号的
'province_id'
表示你模型2
上的字段,而后面的没有引号的字段province_id
表示当前对象上的字段。另外,要了解一下,onchange方法会逐渐被compute方法所取代。
-
@digitalsatori 谢谢您的回答,解决了困惑我几周的问题。
另外想询问您关于“onchange方法会逐渐被compute方法所取代”的疑问:在我学习到的知识里,compute与@api.depends()是联动的,在监听到值改变后,用于实时计算值,是否我忽略了其它东西? -
@阿巴阿巴 在 关于many2one的domain问题 中说:
我学习到的知识里,compute与@api.depends()是联动的,在监听到值改变后,用于实时计算值,是否我忽略了其它东西?
对啊,所以说compute字段通过depends可以取代onchange方法啊。至于onchange返回warning,domain这些也可以用其他方法来替代。
-