【问题标题】:Where does Odoo 9 physically store the `image` field of `res.partner` records in the database?Odoo 9 将 `res.partner` 记录的 `image` 字段物理存储在数据库中的什么位置?
【发布时间】:2016-08-05 21:09:45
【问题描述】:

我在 Odoo 9 PostgreSQL 数据库的res_partner 表中找不到image 列? Odoo 9 将这个图像字段存储在哪里?

【问题讨论】:

  • 可能值得指定您正在使用的 Odoo 版本。 9.0版本的存储位置发生了变化
  • 是的,我正在使用 Odoo 9.0

标签: postgresql openerp


【解决方案1】:

从 Odoo 9 开始,许多 binary 字段已修改为存储在 ir.attachment 模型(ir_attachment 表)中。这样做是为了从文件系统存储(和重复数据删除属性)中受益并避免数据库膨胀。

这在带有attachment=True 参数的二进制字段上启用,就像为res.partner's image fields 所做的那样。

当激活时,二进制字段的get()set() 方法将store and retrieve the valueir.attachment 表中。如果您查看code,您会看到附件使用以下值来建立到原始记录的链接:

  • name:二进制字段的名称,例如image
  • res_field:二进制字段的名称,例如image
  • res_model:包含字段的模型,例如res.partner
  • res_id:二进制字段所属记录的ID
  • type: 'binary'
  • datas:虚拟字段,包含二进制字段的内容,实际存储在磁盘上

因此,如果您想检索包含 ID 为 32 的 res.partnerimage 值的 ir.attachment 记录,您可以使用以下 SQL:

SELECT id, store_fname FROM ir_attachment
WHERE res_model = 'res.partner' AND res_field = 'image' AND res_id = 32;

因为ir_attachment 条目默认使用文件系统存储,store_fname 字段的实际值将为您提供 Odoo 文件存储中图像文件的路径,格式为 'ab/abcdef0123456789',其中 abc... 值是文件的 SHA-1 哈希。这就是 Odoo 实现附件重复数据删除的方式:具有相同文件的多个附件将映射到磁盘上的同一个唯一文件。

如果您想以编程方式修改image 字段的值,强烈建议使用ORM API(例如write() 方法),以避免产生不一致或不得不手动重新实现文件存储系统。

参考文献

  • 这里是original 9.0 commit,它介绍了将二进制字段存储为附件的功能
  • 还有将 res.partner 的 image 字段转换为使用它的 9.0 commit

【讨论】:

  • 非常感谢 :) 你能告诉我哪个表用于链接附件和 res_partner 表中的数据吗? res_partner 图片绑定附件的关系在哪里?
  • 不客气!将ir.attachment 中的数据与res.partner 的行链接起来的表就是ir_attachment 表本身。它的列res_modelres_fieldres_idres_partner 或任何其他具有attachment=True 二进制字段的表建立了一种many2one 关系。我添加了一个 SQL 查询示例,您可以使用它来检索给定合作伙伴的附件,并添加一些说明以在文件存储中查找实际图像文件。
  • @odony 我知道这是一个非常古老的问题,但也许您还记得 Odoo 8 中的附件是如何链接的吗?因为没有'res_field'
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
相关资源
最近更新 更多