2016-04-14 79 views

回答

12

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

使用attachment=True参数在二进制字段上启用此功能,因为它是为res.partner's image fields完成的。

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

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

因此,如果内容虚拟场您想要检索ir.attachment记录,其中ID为res.partnerimage的值为012,您可以使用以下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/abcdef'其中abc...值为SHA-1散列的文件。这是Odoo如何实现附件的重复数据删除:具有相同文件的多个附件将映射到磁盘上的同一个唯一文件。

如果你想修改image场编程的价值,强烈推荐使用ORM API(例如write()方法),以避免产生不一致或需要手动重新实现文件存储系统。

参考

  • 这里是引入了对存储二进制领域作为附件
  • 而且该image字段转换res.partner的使用它9.0 commit的特征original 9.0 commit
+0

非常感谢:)您还可以告诉我哪个表用于链接附件和res_partner表中的数据吗?绑定res_partner图片的附件的关系在哪里? –

+1

不客气!将'ir.attachment'中的数据与'res.partner'行关联的表是ir_attachment表本身。它的列res_model,res_field和res_id创建了一个与'res_partner'或任何其他具有'attachment = True'的二进制字段的表的'many2one'关系。我已经添加了一个SQL查询的示例,您可以使用它来检索给定合作伙伴的附件,以及一些解释来查找文件存储上的实际映像文件。 – odony

相关问题