在 Odoo 中覆盖 Python 中的模型字段时出现问题?

Problems overwriting a model field in Python in Odoo?

我创建了一个模块来修改另一个模块(名为 base)。在模块 base 中有 res.partner 模型,在这个模型中有字段 birthdate:

_columns = {
...
    'birthdate': fields.char('Birthdate'),
...
}

我在我的模块中做的是覆盖这个字段使其成为类型 Date:

birthdate = fields.Date('Birthdate')

一切似乎都正常,但是,在更新 Odoo 服务器之后,该列中引入的数据从视图中消失了,当我检查数据库时,我发现列 birthdate 正在与其他列重复birthdate_moved0birthdate_moved1birthdate_moved2 等名称(其中一半是 char 类型,另一半是 日期)。存储在 birthdate 中的值正在移动到这些其他列(这就是我在视图中看不到数据的原因,因为在表单中只显示 birthdate)。

但是,我能够通过 Python 覆盖多个字段。但是这个重复问题发生在模型 res.partner.

的字段 birthdate 和字段 function

我不能下结论。有人可以帮我吗?提前致谢!

您应该将 "new" 字段命名为 'birth_date' 或 'dob' 或 'birthday' 以外的任何名称,以避免更改现有字段数据类型。在下一步中,您可以将值从当前 'birthday' 字段复制到新字段(通过 postgresql)。

最后,一位同事向我展示了解决方案:

这不是 Odoo 的问题,而是 PostgreSQL 的问题。通常,在 PostgreSQL 中,不可能更改列的数据类型(即使这是空的),除了某些情况,例如:

  • integerchar:因为转换为 char 是可能的。因此,在Odoo中,当你将field.Date、field.Integer、field.Many2one等的数据类型更改为fields.Char时,是没有问题的。但是,如果您尝试将 fields.Char 更改为 fields.Date 或 fields.Many2one 或其他任何内容,PostgreSQL 将复制该列,因为尚未准备好进行该类型的转换。

这是因为我无法更改 Char 类型的字段并将其转换为类型 Date(我尝试使用 birthdate)或 Many2one(我的尝试使用 函数 )。另一方面,我能够覆盖一个选择字段(实际上,在 PostgreSQL 中是将一个字符转换为另一个字符)。

总而言之: 如果您要更改字段的数据类型,请检查最终数据类型是否为 char(fields.Char、fields.Selection 等...)或其他可能的类型转换。然后您可以使用与以前相同的名称命名新字段。如果不是,您必须用其他名称命名新字段,否则 PostgreSQL 将使用 name_moved0name_moved1[=28= 复制该列],等等...

希望对大家有所帮助!!