odoo12 通過一個字段控制另一個Many2one字段的domain
場景:用戶在選擇產品類別的時候,二級聯動到對應產品,就是設置一個搜索范圍限制
對於先使用odoo10,再使用odoo12以后,對於同樣的功能,差別真的是深有體會,先來說一下12的,畢竟來的都是求知的。
直接看代碼:
@api.onchange('category_id') def onchange_category_id(self): for rec in self: if rec.category_id: rec.product_id = False # 更改類別時,清空產品 return { 'domain': { 'product_id': [ ('categ_id', '=', rec.category_id.id), ('can_be_expensed', '=', True) ] } } else: # 如果沒選類別直接選產品,就啥都不現實 return { 'domain': { 'product_id': [('id', '=', False)] } }
是不是看代碼就懂了?直接return時,聲明domain,對應一個當前模型的字段,設置范圍就可以了。
再來看odoo10,(10已經沒用了,所以就口頭說一下吧,沒有興趣可以直接拜拜~)
如果我要通過產品類別去更改產品,我需要
1. 在xml視圖上的產品字段上設置一個context,里面傳入產品類別的id
2. 再跑到產品的模型下面,重寫search_read
3. 判斷一下如果是我要限制的產品context
4. 再取出context中存放的產品類別id,加入到args(就是domain)里面
5. 再return數據
是不是很麻煩,而且重寫search_read方法我記得單獨寫還不生效,必須把name_search,search_read......很多個一起寫出來才能生效
就醬~
說一下12這樣的優點吧:
簡單粗暴,不會造成代碼的冗余,不用到處跳模型寫代碼,方便代碼管理