這個問題或許比最初看起來更復雜。如何將繼承對象作爲OpenERP中的子類處理?
假設我有一個父類Animal(我們在OpenERP中將其命名爲animal.base
)。我也有獅子(animal.lion
)和大象(animal.elephant
)的小類。我需要能夠創建一個可以引用Animal的任何子類的many2one字段的視圖。這似乎做以下工作:
class animal_lion(osv.osv):
_name = 'animal.lion'
_inherits = {'animal.base': 'base_id'}
_columns = {
...
'base_id': fields.many2one('animal.base', "Base ID")
}
def roar(self, cr, uid, context=None):
print "rarrrrr"
現在,當我們創建的animal.lion
一個實例,我們可以看到它是在引用animal.base
觀點可見。 (Plain inherit = 'animal.base'
不表現這種方式,FWIW。)
但是,現在讓我們假設我們需要使用這種動物的方法。由於many2one簡單地指animal.base
,我們不知道用戶在視圖中選擇了哪種動物。即使我們碰巧知道只有獅子會被選中,我們也不能撥打roar
,因爲animal.base
對象只會讓我們調用自己定義的方法。我們可以嘗試通過命名方法emit_sound
並嘗試重寫Lion類中的方法來解決此問題。這至少會運行(除了_inherits
之外,您還添加了_inherit
),但它不會生成正確的Lion特定輸出。現在需要的是一些方法來確定基類x
上many2one中選擇的特定實例的動態類型,其中多個子類在同一類x
上指定_inherits
。想象一下虛構的方法get_subtype()
。然後,我們可以說,在我們的按鈕處理程序視圖:
def perform(self, cr, uid, ids, context=None):
this = self.browse(cr, uid, ids[0], context)
subtype_name = this.my_many2one.get_subtype()
subtype = self.pool.get(subtype_name)
# will produce a roar if user picked a lion, else a meep
subtype.emit_sound(cr, uid, context)
另外,有可用於完成相同的任務的任何其他架構? (是的,我設計了這個例子,但它應該說明真正的問題。)[也許在每個子類型實例的字段中編碼子類型名稱? ]
我只限於OpenERP v5,但有興趣知道任何版本的答案。