重命名字段
-
我在创建模型的时候将一个字段名称写错了:
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 :clapping_hands: