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

Odoo 16中JSON无法加载state_id字段的技术问题排查

Odoo 16企业版定时任务创建销售订单时state_id字段无法传递的排查方案

一、先锁定json.dumps环节的问题

  1. 检查mock数据的state_id类型
    Odoo的state_id是关联res.country.state的整数ID,确保你构造的mock数据里state_id是数字而非字符串(比如写state_id: 15而不是state_id: "15")。json.dumps会正常序列化数字,但如果是字符串,Odoo接收后无法匹配关联字段,且日志只会提示字段不存在,不会报错类型错误。
  2. 序列化前先打日志确认数据完整性
    在调用json.dumps之前,直接把构造好的mock数据打印到Odoo日志,确认state_id确实存在:
    import json
    import logging
    
    _logger = logging.getLogger(__name__)
    
    def create_handler(self):
        mock_data = {
            'partner_id': 3,
            'state_id': 15,
            'order_line': [{'product_id': 1, 'product_uom_qty': 2}]
        }
        # 打印原始数据到日志
        _logger.info("待序列化的mock数据: %s", mock_data)
        json_data = json.dumps(mock_data)
        # 同时打印序列化后的JSON字符串
        _logger.info("序列化后的JSON: %s", json_data)
        # 后续传递给创建订单的逻辑
        self.env['sale.order'].create_from_json(json_data)
    
  3. 排查json.dumps的参数是否导致字段丢失
    确认你调用json.dumps时没有使用skipkeys=True这类会跳过非字符串键的参数,也没有自定义default函数过滤掉state_id字段。

二、检查数据传递的完整链路

  1. 反序列化环节验证字段存在性
    在接收JSON并创建订单的方法里,同样打日志确认反序列化后的字典包含state_id:
    def create_from_json(self, json_str):
        data = json.loads(json_str)
        _logger.info("反序列化后的订单数据: %s", data)
        if 'state_id' not in data:
            _logger.error("反序列化后state_id字段丢失!")
        else:
            _logger.info("state_id字段值: %s", data['state_id'])
        return self.create(data)
    
  2. 排查是否有中间逻辑过滤字段
    检查从create_handler到订单创建的中间代码,有没有对数据做过过滤、裁剪(比如用白名单列表但没加state_id),导致字段被意外删除。

三、Odoo内部规则的排查

  1. 检查运行用户的权限
    定时任务默认以admin运行,但如果自定义了运行用户,要确认该用户拥有res.country.state模型的访问权限,以及对应state_id记录的读取权限。Odoo会自动忽略无权限的字段,且不会在日志里明确提示权限问题。
  2. 确认state_id字段的可写属性
    检查sale.order模型的state_id字段是否被自定义模块修改为readonly=True,如果是,创建订单时该字段会被Odoo自动忽略。

四、特殊场景排查

如果你的mock数据是从Odoo记录集里获取的state_id(比如record.state_id),要注意直接序列化记录集对象会失败,必须先转成ID:

# 错误写法
mock_data['state_id'] = self.env['res.country.state'].browse(15)
# 正确写法
mock_data['state_id'] = self.env['res.country.state'].browse(15).id

内容的提问来源于stack exchange,提问作者Jessie Daniels

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:02:38