Odoo 17社区版如何通过API返回JSON字段?调试遇错求助
Odoo 17社区版JSON接口访问报错排查方案
问题1:请求方法不匹配
你的路由仅允许POST请求,但浏览器直接输入URL发起的是GET请求,这会触发错误。解决方式二选一:
- 修改路由配置,同时支持
GET和POST:@http.route('/api/contacts', type='json', auth='public', methods=['GET', 'POST']) - 使用Postman、curl等工具发送
POST请求,请求体可传空JSON(接口未用到请求数据)。
问题2:Public用户权限不足
路由设置auth='public',但Odoo默认Public用户没有res.partner模型的读取权限,查询联系人时会抛出权限错误。解决步骤:
- 进入Odoo后台,依次打开「设置」→「技术」→「权限」→「组」,找到Public组。
- 编辑该组,在「访问权限」标签下找到
联系人(res.partner)模型,勾选「读取」权限。 - 保存后刷新权限缓存(可重启Odoo或在设置中点击「刷新权限」)。
可选优化:避免空字段报错
代码中直接获取contact.state_id.name和contact.country_id.name,若联系人未设置州/国家,会触发AttributeError。修改为:
'state': contact.state_id.name if contact.state_id else '', 'country': contact.country_id.name if contact.country_id else ''
修改后的完整代码
from odoo import http from odoo.http import request class ContactController(http.Controller): @http.route('/api/contacts', type='json', auth='public', methods=['GET', 'POST']) def get_contacts(self): try: # 打印请求数据用于调试 print("Request data:", request.jsonrequest) # 查询非公司类型的联系人 contacts = request.env['res.partner'].search([('is_company', '=', False)]) contact_list = [] for contact in contacts: contact_list.append({ 'id': contact.id, 'name': contact.name, 'email': contact.email, 'phone': contact.phone, 'street': contact.street, 'city': contact.city, 'state': contact.state_id.name if contact.state_id else '', 'country': contact.country_id.name if contact.country_id else '' }) return contact_list except Exception as e: # 打印异常信息用于调试 print("Error:", str(e)) return {'error': str(e)}
内容的提问来源于stack exchange,提问作者user3891365
相关产品推荐
相关产品推荐

