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

本文介绍了在Odoo 12中如何在同一个模型(Model Amodel)中实现多个附件字段。通过Amodel.py的模型定义和Amodel_view.xml的视图配置,详细阐述了如何进行附件的上传与管理。所有附件存储在filestore,并与ir.attachment模块紧密关联。
摘要由CSDN通过智能技术生成

一、问题

一个模型(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',
实现这个功能,你需要编写一个Odoo的Controller,用于处理HTTP请求并返回文件。具体步骤如下: 1. 首先,在你的模块中创建一个Controller,继承Odoo的Controller类: ``` from odoo import http from odoo.http import request class AttachmentController(http.Controller): @http.route('/my_module/download_attachments', type='http', auth='user') def download_attachments(self, attachment_ids=None, **kwargs): # 处理请求的代码 ``` 2. 在Controller中,你需要编写download_attachments()方法,用于处理HTTP请求。方法中的attachment_ids参数是一个逗号分隔的many2many字段的id值,用于表示用户选择的要下载的附件。在方法中,你需要获取这些附件的内容,并将它们拼接起来。 3. 获取many2many字段的记录,可以使用request.env['model.name'].browse(ids)方法。在这里,model.name是你的many2many字段所关联的模型的名称,ids是attachment_ids参数分割后的id列表。然后,你可以通过循环迭代这些记录,使用attachment.datas获取每个附件的内容,并将它们拼接起来。 4. 将拼接后的内容返回给用户,可以使用BytesIO对象。将拼接后的内容写入BytesIO对象中,然后使用seek()函数将文件指针移到文件开头,最后使用getvalue()函数获取拼接后的内容。将内容设置为response的data字段,设置Content-Type为application/octet-stream,Content-Disposition为attachment,这样浏览器就会将内容作为附件下载。 下面是完整的代码示例: ``` from io import BytesIO from odoo import http from odoo.http import request class AttachmentController(http.Controller): @http.route('/my_module/download_attachments', type='http', auth='user') def download_attachments(self, attachment_ids=None, **kwargs): # 获取many2many字段关联的记录 attachments = request.env['my_model'].browse(attachment_ids.split(',')) # 将所有附件内容拼接在一起 output = BytesIO() for attachment in attachments: output.write(base64.b64decode(attachment.datas)) # 将拼接后的内容作为文件下载 output.seek(0) response = http.send_file(output, filename='merged_attachment.pdf', as_attachment=True, mimetype='application/octet-stream') return response ``` 希望这个例子对你有所帮助,具体实现还需要根据你的业务场景进行适当修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值