【发布时间】:2016-08-05 21:09:45
【问题描述】:
我在 Odoo 9 PostgreSQL 数据库的res_partner 表中找不到image 列? Odoo 9 将这个图像字段存储在哪里?
【问题讨论】:
-
可能值得指定您正在使用的 Odoo 版本。 9.0版本的存储位置发生了变化
-
是的,我正在使用 Odoo 9.0
标签: postgresql openerp
我在 Odoo 9 PostgreSQL 数据库的res_partner 表中找不到image 列? Odoo 9 将这个图像字段存储在哪里?
【问题讨论】:
标签: postgresql openerp
从 Odoo 9 开始,许多 binary 字段已修改为存储在 ir.attachment 模型(ir_attachment 表)中。这样做是为了从文件系统存储(和重复数据删除属性)中受益并避免数据库膨胀。
这在带有attachment=True 参数的二进制字段上启用,就像为res.partner's image fields 所做的那样。
当激活时,二进制字段的get() 和set() 方法将store and retrieve the value 在ir.attachment 表中。如果您查看code,您会看到附件使用以下值来建立到原始记录的链接:
name:二进制字段的名称,例如image
res_field:二进制字段的名称,例如image
res_model:包含字段的模型,例如res.partner
res_id:二进制字段所属记录的IDtype: 'binary'
datas:虚拟字段,包含二进制字段的内容,实际存储在磁盘上因此,如果您想检索包含 ID 为 32 的 res.partner 的 image 值的 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() 方法),以避免产生不一致或不得不手动重新实现文件存储系统。
参考文献
image 字段转换为使用它的 9.0 commit。【讨论】:
ir.attachment 中的数据与res.partner 的行链接起来的表就是ir_attachment 表本身。它的列res_model、res_field 和res_id 与res_partner 或任何其他具有attachment=True 二进制字段的表建立了一种many2one 关系。我添加了一个 SQL 查询示例,您可以使用它来检索给定合作伙伴的附件,并添加一些说明以在文件存储中查找实际图像文件。