2015-09-21 5 views
6

से अधिक है यह एक महत्वपूर्ण साधारण समस्या प्रतीत होती है, लेकिन किसी भी तरह से मुझे कोई समाधान नहीं मिल रहा है।odoo 8 में ओवरराइडिंग लिखना() विधि RuntimeError में परिणाम: अधिकतम रिकर्सन गहराई

जैसे ही मैं सहेजें बटन दबाता हूं, लेखन विधि निष्पादित की जाएगी। मैं एक मूल्य बदल (या एक समारोह कॉल) वर्तमान मॉडल हर बार लिखने विधि कहा जाता है के लिए चाहते हैं, तो मैं

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

के रूप में अपने मॉडल की विधि लिखने() अधिरोहित है (मॉडल है lager.py और क्षेत्र flaeche = fields.Float(string=u"Fläche (m²)") है)

त्रुटि: 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 मॉडल के एक समारोह कॉल करना चाहते हैं। मैं क्या गलत कर रहा हूँ? record यहाँ किया जा रहा है वर्तमान lager उदाहरण है, इसलिए अपने अनंत प्रत्यावर्तन -

उत्तर

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

अपने lager.write विधि में, self.flaeche=37 बयान field.__set__() जो कहता है record.write() के लिए एक कॉल से चलाता है।

मुझे ओडू के बारे में ज़िलच नहीं पता है, लेकिन उम्मीद है कि write पर कॉल ट्रिगर किए बिना फ़ील्ड सेट करने का एक तरीका होना चाहिए - अन्यथा, अच्छी किस्मत।

1

इस तरह मेरे लिए काम करता है, पूर्वज वर्ग बुला:

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

समाधान है जब आप एक नए मॉडल को ओवरराइट कर रहे हों, तो विरासत में न हो।

+0

मुझे नहीं पता कि यह कैसे आवश्यक होगा। प्रत्येक मॉडल 'मॉडल' मॉडल से विरासत में मिलता है, इसलिए "विरासत मॉडल" जैसी कोई चीज़ नहीं है। –

संबंधित मुद्दे