OpenERP—为什么要在创建新记录时在create()之后调用write()方法?

OpenERP—为什么要在创建新记录时在create()之后调用write()方法?,openerp,odoo,Openerp,Odoo,在product类中,我重写了create()和write()方法。但是,当我创建新产品时,会调用create()以及write()。我的理解是只应调用create()。我做错了什么 代码如下: class product_product(osv.Model): _inherit = 'product.product' def create(self, cr, uid, vals, context=None): default_code = vals.get('

在product类中,我重写了
create()
write()
方法。但是,当我创建新产品时,会调用
create()
以及
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')

通常,正如您所说,不应该在产品创建时调用write方法

在这种情况下,我认为最好在create方法中放置一个调试器断点,然后在父亲的create中输入,以查看它是否调用write()


还有一个额外的注意事项,我非常确定在编写过程中还应该调用super()。

旁注:应该在默认代码上添加SQL级别的唯一约束,而不是在那里进行检查。你的假设似乎是正确的。但是,这实际上取决于实例和安装的模块。例如,实例中可能有另一个加载项覆盖create并调用write。为了更好地理解,您需要在调用write()的实现时发布堆栈跟踪。谢谢您的评论。有任何解决方案@Nebojsa吗?