跳至内容

Odoo Online 版本 19.3

更新日志

1. BinaryValue 新类型 (#244421)


功能: 引入 BinaryValue 类,作为 Binary 字段的缓存和记录格式。


核心变化:


- BinaryValue 是 collections.abc.Buffer 的子类,支持延迟加载二进制内容

- 缓存中存储原始字节而非 base64 编码,节省 33% 内存

- 仅在 RPC 通信时才做 base64 编码

- 提供辅助方法:获取 bytes、编码为 base64、获取 mimetype、decode() 等

- 创建值用 BinaryBytes(buffer)

- datas 字段被软弃用,建议直接用 raw

- bin_size 上下文键仅用于 Model.read()


影响: 给 Binary 字段赋值 str 时,系统假定是 base64 并自动解码;处理图片更简便。


----------------------------------------------------------------------------------------


2. x2many 缓存污染修复 (#254944)


功能: 解决了 x2many 字段的权限缓存污染问题。


核心变化:


- 缓存中以 sudo 模式存储所有关联记录 ID

- 从缓存转换为 recordset 时,按当前用户权限过滤不可访问的记录

- 修复前: record.sudo().tag_ids 先执行后,record.tag_ids 直接返回缓存中的全部记录(包含无权限的)

- 修复后: record.tag_ids 始终只返回当前用户可访问的记录

- 避免每次访问 x2m 字段时重复检查权限,提升性能

- 如需用更新后的权限重新检查:record.sudo().x2m.sudo(False)._filtered_access('read')


----------------------------------------------------------------------------------------


3. 域运算符 "access" 实现自定义访问权限 (#254381 & #239862)


功能: 用域(domain)表达式来定义访问规则,引入 access 运算符。


核心变化:


- 新增 _access_domain() 方法,返回定义可访问记录的域,替代旧的 _check_access()

- 域运算符 access 可显式检查 comodel 的权限

- 将 ir.attachment、mail.message、mail.activity 的访问控制改为真正的记录规则实现

- 搜索时添加 search_domain 上下文键(包含优化后的用户域),用于构建更高效的安全规则

- 当安全域完全优化后返回 ('id', 'any!', query) 形式时,可直接使用该查询,减少一次额外 SQL 查询

- 支持自定义域的 SQL 优化回退

- 使用 _inherits 的模型会考虑父模型的记录规则


----------------------------------------------------------------------------------------


4. Model.concat / Model.union 更简洁的 API (#249731)


功能: 简化记录集合并操作的 API。


核心变化:


- concat() 和 union() 现在接受可迭代对象作为参数

- 弃用旧写法中自动包含 self.ids 的行为


# 旧写法

records.browse().concat(*list(...))


# 新写法

model.concat(...)


- odoo.tools.intervals 中的 union 改为使用 __or__ 运算符


----------------------------------------------------------------------------------------


5. 一次写入多个翻译 (#246357)


功能: 支持用字典一次性给翻译字段赋值多种语言的内容。


用法:


record.translated_field = {

     'en_US': 'Hello',

     'fr_FR': 'Bonjour',

     'zh_CN': '你好',

}


行为规则:


- translate=True 字段: 仅更新指定语言的值

- model_terms 字段(callable(field.translate)):

  - 所有语言值必须具有相同的 HTML/XML 结构

  - 如果某语言值与旧值相同,视为确认旧值,新术语作为新翻译处理

  - 未指定语言的术语不受影响

- 非存储计算字段: 也支持字典赋值,更新传播到原始字段

- 计算方法和约束函数只触发一次


技术实现: 新增 StoredTranslations 类(字典兼容),用于事务缓存中管理翻译值的逻辑约束和 HTML/XML 结构一致性。