odoo 12 : 附件(ir.attachment)——同一模型多个附件字段


一、问题

一个模型(Model)中,添加多个可上传附件(ir.attachment)的字段

二、解决方案

模型:Amodel.py

class Amodel(models.Model):
	……
	first_attachment = fields.Many2many(   
        'ir.attachment',					#关联附件模型
        relation='first_res_att_rel',		#关联表(字段与 ir.attachment 表的附件的关联表名)
        column1='first_id',					# first_attachment 的 id 列
        column2='att_id'					# ir.attachment 表的附件 id 列
    )
    second_attachment = fields.Many2many(   
        'ir.attachment',						
        relation='second_res_att_rel',		
        column1='second_id',					
        column2='att_id'					
    )
    third_attachment = fields.Many2many(   
        'ir.attachment',						
        relation='third_res_att_rel',		
        column1='third_id',					
        column2='att_id'					
    )

视图:Amodel_view.xml

    
        Amodel Form
        amodel.category
        
            
                
            
            
                
            
            
                
            
        
    

附件的相关操作:Amodel.py

class Amodel(models.Model):
	……
	first_attachment ……
 	……
 	
	# 通过查询关系表获取已上传的附件
	def _get_records_from_relation(self,query,type):
	
        # 从关系表读取附件的ids
        self.env.cr.execute(query)		
        query_result = self.env.cr.fetchall()	
        att_ids = []
        for i in range(len(query_result)):
            att_ids.append(query_result[i][0])
            
        # 从odoo中读取附件
		if type =='one':
            att = self.env['ir.attachment'].sudo().search([
            	('res_model', '=', self._name), ('id', '=', max(att_ids))
            ])
            return att
        if type == 'all':
            atts = self.env['ir.attachment'].sudo().search([
            	('res_model', '=', self._name), ('id', 'in', att_ids)
            ])
            return atts

	# 将odoo中的附件解码成原来的文件
	def _get_file(self):
	
		#获取附件,并返回一个附件	
		query = 'SELECT att_id FROM first_res_att_rel WHERE first_id = %d' % (self.id)
		att = self._get_records_from_relation(query, 'one')
		#解码附件
        datas = base64.standard_b64decode(att.datas)
        
         #创建空文件,并以二进制的方式写入
        file_path = '{}\{}\{}'.format(att._filestore(), att.store_fname.split('/')[0], att.datas_fname)
        file = open(file_path, 'wb+') 
        file.write(datas)
        file.close()
       


三、更多

文件存储:filestore

项目 说明
filestore odoo默认的附件存储路径
路径格式:/ var / lib / odoo / filestore / 数据库名 / store_fname路径
data_dir filestore 的路径配置
安装odoo时,在手动创建的 odoo.conf 文件中写入,如:data_dir = …\filestore

附件:ir.attachment

字段 类型 说明
res_id integer 所属记录
res_model char 所属model
name char 附件显示名称
datas_fname char 附件名称
datas binary base64编码的文件
store_fname char 附件存储的软地址
_filestore() function 返回附件的实际存储路径
type selection url/binary
url char url连接地址
db_datas binary 如不是存储数据库,存储实体
companyjd Many2one 默认公司
description text 附件简介




你可能感兴趣的:(odoo,附件,ir.attachment,odoo)