top of page

Odoo - Dynamic Domain of a Many2One field

  • Writer: Tek Siong, Hock
    Tek Siong, Hock
  • Mar 5, 2022
  • 1 min read

Updated: Dec 16, 2022

If you have a requirement to restrict the selection of a Many2one field, eg, customers or vendors, based on the value of another field or other complex condition, you may use the following 2 example codes.


  1. This is a simple way to restrict the opportunities drop down values that belonged to the customer_name


opportunity_id = fields.Many2one('crm.lead', string="Opportunity")
customer_name = fields.Many2one('res.partner', string='Customer')

@api.onchange('customer_name')
def onchange_customer_name(self):
    for rec in self:
        return {'domain': {'opportunity_id': [('partner_id', '=', rec.customer_name.id)]}}


2. This is more complex way to retrieve the drop down value with logic. You will need a domain field (many2many) that will return the list of the vendors.


@api.multi
@api.depends("place_of_delivery")
def _get_vendor_domain(self):
    for obj in self:
        vendor_ids = []
        for line in obj.place_of_delivery.haulage_charge_line_ids:
            for vendor_id in line.vendor_id.ids:
                vendor_ids.append(vendor_id)
            self.vendor_list = [(6,0, vendor_ids)]

vendor = fields.Many2one('res.partner', string="Vendor")
vendor_list = fields.Many2many('res.partner',store=True,compute=_get_vendor_domain)


<field name="vendor_list" invisible="1"/>
<field name="vendor" domain="[('id','in',vendor_list)]"/>

Note that there is a web domain field to do that as well.

Recent Posts

See All
Odoo Performance Profile for debugging

Odoo Performance Profile for debugging, If you are on Odoo 16 and below, and need a good tool for debugging the performance of your Odoo system, this will be the right content for you.

 
 
 

Comments


Subscribe Form

  • facebook
  • linkedin

©2019 by Excelroot Technology Sdn Bhd.

bottom of page