• 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

重命名字段

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
5 帖子 2 发布者 1349 浏览
    • 从旧到新
    • 从新到旧
    • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • W 离线
    W 离线
    wangyuhui
    写于 最后由 编辑
    #1

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

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

    W 1 条回复 最后回复
    0
  • W 离线
    W 离线
    wangyuhui
    在 中回复了wangyuhui 最后由 编辑
    #2

    https://www.odoo.com/zh_CN/forum/help-1/question/rename-a-model-field-how-to-propagate-change-to-database-schema-83863 重启再升级并没有用...

    1 条回复 最后回复
    0
  • digitalsatoriD 离线
    digitalsatoriD 离线
    digitalsatori 管理员
    写于 最后由 digitalsatori 编辑
    #3

    看了一下代码,当字段中有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)
    

    【上海先安科技】(tony AT openerp.cn)

    1 条回复 最后回复
    0
  • W 离线
    W 离线
    wangyuhui
    写于 最后由 编辑
    #4

    @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成功。数据库删除字段后再更新就成功了。
    谢谢!

    1 条回复 最后回复
    0
  • digitalsatoriD 离线
    digitalsatoriD 离线
    digitalsatori 管理员
    写于 最后由 编辑
    #5

    cool 👏

    【上海先安科技】(tony AT openerp.cn)

    1 条回复 最后回复
    0

  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。