最近、odoo(以前のOpenERP)V8がリリースされました。新しいAPIメソッドでは、デコレータが導入されています。 models.py
のメソッドは、@api.one
または@api.multi
で装飾する必要があります。
参照 odooドキュメント 正確な使用法を特定できません。誰でも詳しく説明できますか?.
ありがとう。
通常、両方のデコアレータは、 'self
'にrecordset(s)が含まれるレコードスタイルのメソッドを装飾するために使用されます。 @api.one
と@api.multi
をいつ使用するかを簡単に説明します。
1。@api.one
:
'self'がシングルトンインスタンスであると予想されるレコードスタイルのメソッドを装飾します。
装飾されたメソッドは自動的にレコードをループし(つまり、レコードセット内のレコードごとにメソッドを呼び出します)、結果を含むリストを作成します。
メソッドが@returnsで装飾されている場合、結果のインスタンスを連結します。そのような方法:
@ api.one def method(self、args):self.nameを返します
次のように、レコードスタイルと従来のスタイルの両方で呼び出すことができます。
# recs = model.browse(cr, uid, ids, context)
names = recs.method(args)
names = model.method(cr, uid, ids, args, context=context)
2。@api.multi
:
'self
'がレコードセットであるレコードスタイルのメソッドを装飾します。このメソッドは通常、レコードに対する操作を定義します。そのような方法:
@ api.multi def method(self、args):
次のように、レコードスタイルと従来のスタイルの両方で呼び出すことができます。
# recs = model.browse(cr, uid, ids, context)
recs.method(args)
model.method(cr, uid, ids, args, context=context)
いつ使用するか:
@ api.oneを使用している場合、戻り値はリストにあります。これは、Webクライアントで常にサポートされているわけではありません。ボタンのアクションメソッドについて。その場合は、@ api.multiを使用してメソッドを装飾し、おそらくメソッド定義でself.ensure_one()を呼び出す必要があります。
戻り値の副作用を回避するために、@ api.oneの代わりにself.ensure_one()とともに@ api.multiを使用することをお勧めします。
@ api.one:
このデコレータは、RecordSetのレコードを自動的にループします。自己は現在のレコードとして再定義されます:
@api.one
def func(self):
self.name = 'xyz'
@ api.multi:
Selfは、反復なしで現在のRecordSetになります。これはデフォルトの動作です。
@api.multi
def func(self):
len(self)
すべてのAPIの詳細な説明については、これを参照できます リンク
@api.model #When the record data/self is not as relevant. Sometimes also used with old API calls.
def model_text(self):
return "this text does not rely on self"
@api.multi #Normally followed by a loop on self because self may contain multiple records
def set_field(self):
for r in self:
r.abc = r.a + r.b
@api.one #The api will do a loop and call the method for each record. Not preferred because of potential problems with returns to web clients
def set_field(self):
self.abc = self.a + self.b