这个问题可能比最初看起来更复杂。
假设我有一个父类 Animal(我们在 OpenERP 中将其命名为animal.base
)。我还有子类 Lion ( animal.lion
) 和 Elephant ( 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
。(Plaininherit = 'animal.base'
不会这样,FWIW。)
但是,现在假设我们需要使用这种动物的方法。由于 many2one 仅指animal.base
,我们不知道用户在视图中选择了哪种动物。即使我们碰巧知道只有狮子会被选中,我们也不能调用roar
,因为animal.base
对象只会让我们调用自己定义的方法。emit_sound
我们可以尝试通过命名方法并尝试覆盖 Lion 类中的方法来绕过它。这至少会运行(一旦你添加一个_inherit
除了_inherits
),但它不会产生正确的 Lion 特定输出。需要某种方法来确定在基类的 many2one 中选择的特定实例的动态类型,x
其中多个子类_inherits
在同一类上指定x
. 想象一个虚构的方法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,但有兴趣知道任何版本的答案。