2014-12-08 1 views
1

В классе product_product я переоценил методы create() и write(). Но когда я создаю новый продукт, вызывается create(), а также write(). Я понимаю, что нужно называть только create(). Что я делаю не так?OpenERP - Почему метод write() вызывается после create(), когда должна быть создана новая запись?

Вот код:

class product_product(osv.Model): 
    _inherit = 'product.product' 

    def create(self, cr, uid, vals, context=None): 
     default_code = vals.get('default_code') 
     categ_id = vals.get('categ_id') 
     class_number = self.pool.get('product.category').browse(cr, uid, categ_id, context=context).x_category_code 
     item_number_validation_check(default_code, class_number) 
     # If default_code already exist, raise error 
     pp_obj = self.pool.get('product.product') 
     id_s = pp_obj.search(cr, uid, [('default_code', '=', default_code)]) 
     if len(id_s) != 0: 
      raise osv.except_osv(('Error!'), ('The item number already exists!')) 
     return super(product_product, self).create(cr, uid, vals, context=context) 

    def write(self, cr, uid, ids, vals, context=None): 
     new_default_code = vals.get('default_code') 
+0

Замечание: вы должны добавить уникальное ограничение уровня SQL на default_code, а не выполнять проверку там. Вы предположение похоже правильный. Однако это действительно зависит от экземпляра и установленных модулей. Например, в экземпляре может быть другой аддон, который переопределяет создание и вызывает запись. Чтобы лучше понять, вам нужно опубликовать трассировку стека, когда вы достигнете вызова вашей реализации write(). –

+0

Спасибо за комментарий. – Nebojsa

ответ

0

Обычно, и как вы говорите, метод записи не должен быть вызван на создание продукта.

В этом случае я считаю, что чем лучше вы могли бы сделать, так это установить точку останова отладчика в свой метод create и оттуда войти в создание отца, чтобы увидеть, вызывает ли это вызов write().

А также дополнительное примечание, я уверен, что в записи вы также должны поместить вызов super().