Python Odoo中如何将字符串形式的模型记录转为可读取字段的模型对象
问题原因
你在方法1中直接将sale.order记录集放入data传参时,Odoo报表框架会自动把记录集序列化为字符串格式,也就是你拿到的sale.order(1,2,3)这类文本,无法直接当成记录集对象操作。
方案1(推荐,Odoo标准写法,稳定性最高)
直接修改方法1的传参逻辑,不传记录集本身,只传记录ID列表,避免序列化问题:
def print_xls(self): record = self.env['sale.order'].search([('id','in',filtered_list)]) data = { # 仅传递记录ID列表,不传递记录集对象 'sale_order_ids': record.ids } return self.env.ref('module_name.report_name').report_action(self, data=data)
然后在方法2中通过ID列表直接获取记录集:
def generate_xlsx_report(self, workbook, data, lines): h1 = workbook.add_format({'font_size': 16, 'align': 'center', 'valign':'vcenter', 'bold': True,'underline':True}) sheet = workbook.add_worksheet('sale dept') sheet.merge_range(1, 0, 3, 17,"Sale Report",h1) # 用ID列表批量获取记录集 sale_orders = self.env['sale.order'].browse(data['sale_order_ids']) # 直接按对象方式读取字段即可 for order in sale_orders: print(order.name, order.amount_total, order.partner_id.name)
方案2(仅适合无法修改方法1传参的场景)
如果你没有权限调整方法1的逻辑,只能处理已拿到的字符串,就解析字符串提取ID再获取记录集:
def generate_xlsx_report(self, workbook, data, lines): # 格式、工作表初始化代码省略 import re # 提取字符串中括号内的ID部分 rec_str = data['model_recs'] ids_part = re.search(r'\((.*?)\)', rec_str).group(1) rec_ids = list(map(int, ids_part.split(','))) # 获取记录集 sale_orders = self.env['sale.order'].browse(rec_ids)
注意:方案2依赖字符串固定格式,一旦后续Odoo版本调整记录集序列化规则、或者模型名修改,就会出现解析异常,非必要不建议使用。
内容的提问来源于stack exchange,提问作者user10810227
相关产品推荐
相关产品推荐

