Odoo中如何根据选中卖家动态过滤产品Many2one字段
搞定Odoo中Onchange过滤关联字段的问题
嘿,我来帮你解决这个字段过滤的需求!你的场景分两部分,但核心逻辑是复用卖家表单里的product_details关联关系,下面一步步给你讲清楚:
一、实现选择Seller后自动过滤Products字段
你已经搭好了onchange的框架,只需要补充domain的过滤条件就行。关键是要拿到选中卖家关联的所有产品ID,然后把Products字段的下拉框限制在这些ID范围内。完整代码如下:
from odoo import models, fields, api class YourModel(models.Model): _name = 'your.model.name' # 记得替换成你实际的模型名称 _description = 'Your Model Description' seller = fields.Many2one('res.partner', string="Select Seller", domain="[('supplier','=',True)]") products = fields.Many2one('product.template', string="Select Product") @api.onchange('seller') def onchange_field_seller(self): res = {} if self.seller: # 只显示当前卖家在product_details里关联的产品 res['domain'] = {'products': [('id', 'in', self.seller.product_details.ids)]} else: # 没选卖家时,清空可选范围(也可以改成[()]恢复全量可选,看你需求) res['domain'] = {'products': []} return res
关键逻辑说明:
- 当用户选中
seller后,self.seller会指向对应的res.partner记录,我们通过self.seller.product_details.ids直接拿到该卖家关联的所有产品ID列表。 - 把
products字段的domain设置为[('id', 'in', 上述ID列表)],这样下拉框就只会显示该卖家关联的产品,完全符合你的要求。 - 如果用户清空了卖家选择,这里把domain设为
[],此时产品字段无法选择任何选项;如果你希望没选卖家时能看到所有产品,把这行改成res['domain'] = {'products': [()]}就行。
二、确保Products仅显示卖家创建时关联的产品
其实上面的代码已经完美解决这个问题了!因为你在卖家(res.partner)的表单里用product_details = fields.Many2many('product.template')来关联产品,而我们的onchange逻辑就是直接用这个关联关系来过滤——products字段只会显示当前选中卖家在product_details里添加的那些产品,完全满足你的需求。
额外优化小技巧:
如果想让用户必须先选卖家才能选产品,可以给products字段加个attrs属性,没选卖家时灰化字段:
products = fields.Many2one('product.template', string="Select Product", attrs={'readonly': [('seller', '=', False)]})
这样用户体验会更流畅,不会误操作。
内容的提问来源于stack exchange,提问作者p.ry
相关产品推荐
相关产品推荐

