2015-09-21 9 views
6

これはかなり単純な問題ですが、何とか解決策を見つけることができません。odoo 8のwrite()メソッドをオーバーライドするとRuntimeErrorが発生します:最大再帰深度を超えました

保存ボタンを押すと、書き込みメソッドが実行されます。私は、値を変更する(または関数を呼び出す)現在のモデルのために書き込みメソッドが呼び出されるたびにしたいので、私は

@api.multi 
def write(self, vals): 
    self.flaeche = 37 
    return super(lager, self).write(vals) 

としての私のモデルのwrite()メソッドをオーバーライドしています(モデルはlager.pyで、フィールドは​​)

ですエラー:RuntimeError: maximum recursion depth exceeded

Traceback (most recent call last): 
    File "/home/tertia/workspace/odoo8/openerp/http.py", line 530, in _handle_exception 
    return super(JsonRequest, self)._handle_exception(exception) 
    File "/home/tertia/workspace/odoo8/openerp/http.py", line 567, in dispatch 
    result = self._call_function(**self.params) 
    File "/home/tertia/workspace/odoo8/openerp/http.py", line 303, in _call_function 
    return checked_call(self.db, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/service/model.py", line 113, in wrapper 
    return f(dbname, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/http.py", line 300, in checked_call 
    return self.endpoint(*a, **kw) 
    File "/home/tertia/workspace/odoo8/openerp/http.py", line 796, in __call__ 
    return self.method(*args, **kw) 
    File "/home/tertia/workspace/odoo8/openerp/http.py", line 396, in response_wrap 
    response = f(*args, **kw) 
    File "/home/tertia/workspace/odoo8/openerp/addons/web/controllers/main.py", line 936, in call_kw 
    return self._call_kw(model, method, args, kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/addons/web/controllers/main.py", line 928, in _call_kw 
    return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 363, in old_api 
    result = method(recs, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/custom_modules/g4e_config/lager.py", line 225, in write 
    self.flaeche = 37 
    File "/home/tertia/workspace/odoo8/openerp/fields.py", line 853, in __set__ 
    record.write({self.name: self.convert_to_write(value)}) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 239, in wrapper 
    return new_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/custom_modules/g4e_config/lager.py", line 225, in write 
    self.flaeche = 37 
    File "/home/tertia/workspace/odoo8/openerp/fields.py", line 853, in __set__ 
    record.write({self.name: self.convert_to_write(value)}) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 239, in wrapper 
    return new_api(self, *args, **kwargs) 

..... 

    File "/home/tertia/workspace/odoo8/custom_modules/g4e_config/lager.py", line 225, in write 
    self.flaeche = 37 
    File "/home/tertia/workspace/odoo8/openerp/fields.py", line 853, in __set__ 
    record.write({self.name: self.convert_to_write(value)}) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 239, in wrapper 
    return new_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/custom_modules/g4e_config/lager.py", line 225, in write 
    self.flaeche = 37 
    File "/home/tertia/workspace/odoo8/openerp/fields.py", line 853, in __set__ 
    record.write({self.name: self.convert_to_write(value)}) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 239, in wrapper 
    return new_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/custom_modules/g4e_config/lager.py", line 224, in write 
    super(lager, self).write(vals) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 239, in wrapper 
    return new_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 546, in new_api 
    result = method(self._model, cr, uid, self.ids, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/addons/mail/mail_thread.py", line 435, in write 
    self.message_auto_subscribe(cr, uid, ids, values.keys(), context=context, values=values) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/addons/mail/mail_thread.py", line 1883, in message_auto_subscribe 
    header_subtype_ids = subtype_obj.search(cr, uid, ['|', ('res_model', '=', False), ('parent_id.res_model', '=', self._name)], context=context) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/models.py", line 1639, in search 
    return self._search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/models.py", line 4621, in _search 
    query = self._where_calc(cr, user, args, context=context) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/models.py", line 4444, in _where_calc 
    e = expression.expression(cr, user, domain, self, context) 
    File "/home/tertia/workspace/odoo8/openerp/osv/expression.py", line 646, in __init__ 
    self.parse(cr, uid, context=context) 
    File "/home/tertia/workspace/odoo8/openerp/osv/expression.py", line 847, in parse 
    right_ids = comodel.search(cr, uid, [(path[1], operator, right)], context=context) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/models.py", line 1639, in search 
    return self._search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/models.py", line 4615, in _search 
    self.check_access_rights(cr, access_rights_uid or user, 'read') 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/models.py", line 3477, in check_access_rights 
    return self.pool.get('ir.model.access').check(cr, uid, self._name, operation, raise_exception) 
    File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "<string>", line 2, in check 
    File "/home/tertia/workspace/odoo8/openerp/tools/cache.py", line 117, in lookup 
    r = d[key] 
    File "/home/tertia/workspace/odoo8/openerp/tools/func.py", line 66, in wrapper 
    return func(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/tools/lru.py", line 38, in __getitem__ 
    self[a[0]] = a[1] 
    File "/home/tertia/workspace/odoo8/openerp/tools/func.py", line 66, in wrapper 
    return func(self, *args, **kwargs) 
    File "/home/tertia/workspace/odoo8/openerp/tools/lru.py", line 44, in __setitem__ 
    del self[obj] 

私はlagerモデルの機能を呼び出したいときも同じことが起こります。 私は何が間違っていますか?ここでは、現在のlagerのインスタンスであることrecord、それ故にあなたの無限の再帰 - あなたのlager.write方法で

答えて

4

問題は、self.flaeche = 37を書くことによってレコードを変更していることです。これは暗黙的にモデルのwrite()メソッドを呼び出していることを意味します。 write()write()から呼び出すと、明らかに再帰で終了します。

あなたが代わりにこれに似た何かを行うことができます:

@api.multi 
def write(self, vals): 
    vals['flaeche'] = 37 
    return super(lager, self).write(vals) 

をこの方法では、追加の書き込みはありません - あなただけとにかく起こることを約あった書き込みの値を変更します。

あなたは、人々が明示的にあなたがこれを行うことができます37の値を上書きできるようにしたい場合:

@api.multi 
def write(self, vals): 
    if 'flaeche' not in vals: 
     vals['flaeche'] = 37 
    return super(lager, self).write(vals) 
+0

ありがとうございます!これだよ! –

2

は、self.flaeche=37文はrecord.write()呼び出すfield.__set__()への呼び出しをトリガします。

私はodooについてzilchについてはわかりませんが、うまくいけばwriteへの呼び出しを引き起こさずにフィールドを設定する方法があるはずです。そうでなければ、不運です。

1

この方法では、上位クラスを呼び出し、私の作品:

@api.multi 
def write(self, vals): 
    vals['flaeche'] = 37 
    return super(models.Model, self).write(vals) 

ソリューションです継承されたモデルではなく、新しいモデルを上書きするときに適しています。

+0

これはどうして必要なのか分かりません。すべてのモデルは 'models.Model'から継承しているので、"継承されていないモデル "のようなものはありません。 –

関連する問題