You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 03:36:04