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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:26:32