Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

重命名字段



  • 我在创建模型的时候将一个字段名称写错了:
    wrong_field = fields.Char('Wrong')
    但是现在已经有数据存放在其中了,想将数据迁移到正确的字段中,在官方文档中发现了“oldname”方法:
    right_field = fields.Char('Right', oldname='wrong_field')
    但是测试下来数据并没有迁移过来。为什么?有什么方法可以达到这个效果?

    http://www.odoov.com/index.php?title=公共字段属性 在这里看到对oldname方法的解释,只有在版本升级的时候才有效?它是怎么区分的?




  • 管理员

    看了一下代码,当字段中有oldname参数时,在更新模块时会调用rename_column函数来更新数据库schema的 ,你装的是什么版本?修改的模块已更新?

    def rename_column(cr, tablename, columnname1, columnname2):
        """ Rename the given column. """
        cr.execute('ALTER TABLE "{}" RENAME COLUMN "{}" TO "{}"'.format(tablename, columnname1, columnname2))
        _schema.debug("Table %r: renamed column %r to %r", tablename, columnname1, columnname2)
    


  • @digitalsatori debug了一下这个方法,发现不起作用是因为我在初始化本地数据库的时候用了有right_field的模型。

        def update_db(self, model, columns):
            """ Update the database schema to implement this field.
    
                :param model: an instance of the field's model
                :param columns: a dict mapping column names to their configuration in database
                :return: ``True`` if the field must be recomputed on existing rows
            """
            if not self.column_type:
                return
    
            column = columns.get(self.name)
            if not column and hasattr(self, 'oldname'):
                # column not found; check whether it exists under its old name
                column = columns.get(self.oldname)
                if column:
                    sql.rename_column(model._cr, model._table, self.oldname, self.name)
    
            # create/update the column, not null constraint, indexes
            self.update_db_column(model, column)
            self.update_db_notnull(model, column)
            self.update_db_index(model, column)
    
            return not column
    

    因为我right_field已经存在在当前表了,所以没有rename成功。数据库删除字段后再更新就成功了。
    谢谢!


  • 管理员

    cool 👏