跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 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 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. 重命名字段

重命名字段

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
5 帖子 2 发布者 1.6k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 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 :clapping_hands:

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

            1 条回复 最后回复
            0

            • 登录

            • 没有帐号? 注册

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