Odoo 16配置翻译后无法访问服务器自定义模型数据求助
问题描述
我在本地机器的carddecks模块中成功添加i18n文件夹及pot文件,并为部分字段设置translate=True,本地可正常访问模型数据。但更新服务器后,访问模型数据时出现如下SQL错误:
LINE 1: ..."write_date", COALESCE("carddecks_card"."cardText"->>'pt_PT'... ^ HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
完整报错信息:
Traceback (most recent call last): File "/usr/lib/python3/dist-packages/odoo/http.py", line 1579, in _serve_db return service_model.retrying(self._serve_ir_http, self.env) File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 134, in retrying result = func() File "/usr/lib/python3/dist-packages/odoo/http.py", line 1608, in _serve_ir_http response = self.dispatcher.dispatch(rule.endpoint, args) File "/usr/lib/python3/dist-packages/odoo/http.py", line 1805, in dispatch result = self.request.registry['ir.http']._dispatch(endpoint) File "/usr/lib/python3/dist-packages/odoo/addons/website/models/ir_http.py", line 235, in _dispatch response = super()._dispatch(endpoint) File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_http.py", line 144, in _dispatch result = endpoint(**request.params) File "/usr/lib/python3/dist-packages/odoo/http.py", line 698, in route_wrapper result = endpoint(self, *args, **params_ok) File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/dataset.py", line 42, in call_kw return self._call_kw(model, method, args, kwargs) File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/dataset.py", line 33, in _call_kw return call_kw(request.env[model], method, args, kwargs) File "/usr/lib/python3/dist-packages/odoo/api.py", line 457, in call_kw result = _call_kw_model(method, model, args, kwargs) File "/usr/lib/python3/dist-packages/odoo/api.py", line 430, in _call_kw_model result = method(recs, *args, **kwargs) File "/usr/lib/python3/dist-packages/odoo/addons/web/models/models.py", line 62, in web_search_read records = self.search_read(domain, fields, offset=offset, limit=limit, order=order) File "/usr/lib/python3/dist-packages/odoo/models.py", line 4968, in search_read result = records.read(fields, **read_kwargs) File "/usr/lib/python3/dist-packages/odoo/models.py", line 2992, in read self._read(stored_fields) File "/usr/lib/python3/dist-packages/odoo/models.py", line 3235, in _read cr.execute(query_str, params + [sub_ids]) File "/usr/lib/python3/dist-packages/odoo/sql_db.py", line 315, in execute res = self._obj.execute(query, params) psycopg2.errors.UndefinedFunction: operator does not exist: character varying ->> unknown LINE 1: ..."write_date", COALESCE("carddecks_card"."cardText"->>'pt_PT'... ^ HINT: No operator matches the given name and argument types. You might need to add explicit type casts. The above server error caused the following client error: OwlError: The following error occurred in onWillStart: "Odoo Server Error" at wrapError (https://www.relationalgames.com/web/assets/504-41b52e3/web.assets_common.min.js:1445:77) at onWillStart (https://www.relationalgames.com/web/assets/504-41b52e3/web.assets_common.min.js:1451:117) at useModel (https://www.relationalgames.com/web/assets/505-11285c6/web.assets_backend.min.js:4709:1) at ListController.setup (https://www.relationalgames.com/web/assets/505-11285c6/web.assets_backend.min.js:4430:645) at new ComponentNode (https://www.relationalgames.com/web/assets/504-41b52e3/web.assets_common.min.js:1407:136) at https://www.relationalgames.com/web/assets/504-41b52e3/web.assets_common.min.js:1929:6 at View.slot1 (eval at compile (https://www.relationalgames.com/web/assets/504-41b52e3/web.assets_common.min.js:1892:370), <anonymous>:15:36) at callSlot (https://www.relationalgames.com/web/assets/504-41b52e3/web.assets_common.min.js:1508:25) at WithSearch.template (eval at compile (https://www.relationalgames.com/web/assets/504-41b52e3/web.assets_common.min.js:1892:370), <anonymous>:8:12) at Fiber._render (https://www.relationalgames.com/web/assets/504-41b52e3/web.assets_common.min.js:1336:96) Caused by: RPC_ERROR: Odoo Server Error at makeErrorFromResponse (https://www.relationalgames.com/web/assets/505-11285c6/web.assets_backend.min.js:967:163) at XMLHttpRequest.<anonymous> (https://www.relationalgames.com/web/assets/505-11285c6/web.assets_backend.min.js:974:13)
问题原因及解决方法
核心原因
PostgreSQL的->>操作符仅支持JSON/JSONB类型的字段,但服务器上的cardText字段仍为character varying(普通字符串类型)。当给Odoo字段设置translate=True后,Odoo会自动将该字段的数据库类型从字符串转换为JSONB,用于存储多语言键值对。服务器出现错误,是因为模块升级时未执行数据库字段类型的迁移操作,导致代码逻辑与数据库字段类型不匹配。
解决步骤
- 升级模块触发迁移:登录服务器的Odoo后台,找到carddecks模块,点击「升级」(Upgrade)按钮,确保模块的数据库迁移脚本完整执行。
- 手动修复字段类型:如果升级操作未生效,可直接连接服务器的PostgreSQL数据库,执行以下SQL语句(操作前请备份数据):
ALTER TABLE carddecks_card ALTER COLUMN cardText TYPE jsonb USING cardText::jsonb;
- 校验代码一致性:确认服务器上的carddecks模块代码与本地完全一致,确保i18n文件夹、pot文件及字段的
translate=True设置都已同步。
内容的提问来源于stack exchange,提问作者MrWater
相关产品推荐
相关产品推荐

