この質問は、おそらく最初に思われるよりも複雑です。
親クラス 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 固有の出力は生成されません。必要なのは、同じクラスx
で複数のサブクラスが指定されているベース クラスの many2one で選択された特定のインスタンスの動的な型を特定する方法です。_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 に制限されていますが、任意のバージョンの答えを知りたいです。