Odoo 16中JSON无法加载state_id字段的技术问题排查
Odoo 16企业版定时任务创建销售订单时state_id字段无法传递的排查方案
一、先锁定json.dumps环节的问题
- 检查mock数据的state_id类型
Odoo的state_id是关联res.country.state的整数ID,确保你构造的mock数据里state_id是数字而非字符串(比如写state_id: 15而不是state_id: "15")。json.dumps会正常序列化数字,但如果是字符串,Odoo接收后无法匹配关联字段,且日志只会提示字段不存在,不会报错类型错误。 - 序列化前先打日志确认数据完整性
在调用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) - 排查json.dumps的参数是否导致字段丢失
确认你调用json.dumps时没有使用skipkeys=True这类会跳过非字符串键的参数,也没有自定义default函数过滤掉state_id字段。
二、检查数据传递的完整链路
- 反序列化环节验证字段存在性
在接收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) - 排查是否有中间逻辑过滤字段
检查从create_handler到订单创建的中间代码,有没有对数据做过过滤、裁剪(比如用白名单列表但没加state_id),导致字段被意外删除。
三、Odoo内部规则的排查
- 检查运行用户的权限
定时任务默认以admin运行,但如果自定义了运行用户,要确认该用户拥有res.country.state模型的访问权限,以及对应state_id记录的读取权限。Odoo会自动忽略无权限的字段,且不会在日志里明确提示权限问题。 - 确认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
相关产品推荐
相关产品推荐

