web-dev-qa-db-ja.com

odooでapi.oneとapi.multiを使用する場合|オープナープ?

最近、odoo(以前のOpenERP)V8がリリースされました。新しいAPIメソッドでは、デコレータが導入されています。 models.pyのメソッドは、@api.oneまたは@api.multiで装飾する必要があります。

参照 odooドキュメント 正確な使用法を特定できません。誰でも詳しく説明できますか?.

ありがとう。

12
BomberMan

通常、両方のデコアレータは、 '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)
  • 'self'が現在のレコードとして再定義されるたび。

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)

いつ使用するか:

  1. @ api.oneを使用している場合、戻り値はリストにあります。これは、Webクライアントで常にサポートされているわけではありません。ボタンのアクションメソッドについて。その場合は、@ api.multiを使用してメソッドを装飾し、おそらくメソッド定義でself.ensure_one()を呼び出す必要があります。

  2. 戻り値の副作用を回避するために、@ api.oneの代わりにself.ensure_one()とともに@ api.multiを使用することをお勧めします。

16
BomberMan

@ api.one

このデコレータは、RecordSetのレコードを自動的にループします。自己は現在のレコードとして再定義されます:

@api.one
def func(self):
    self.name = 'xyz'

@ api.multi

Selfは、反復なしで現在のRecordSetになります。これはデフォルトの動作です。

@api.multi
def func(self):
    len(self)

すべてのAPIの詳細な説明については、これを参照できます リンク

4
bud-e
@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
1
Palza