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 结构一致性。
Odoo Online 版本 19.3