odoo-046 視圖顯示的 name 數據庫中存儲的不一樣

文章目錄

  • 一、問題由來
  • 二、排查經過
    • 1. 問 deepseek
    • 2. 驗證
    • 3. 新問題
  • 三、 總結
  • 四、補充(翻譯模型 `ir.translation` 中 `src` 和 `value` 字段詳解)

一、問題由來

客戶有多個公司,使用多個數據庫。他們有時需要同步不同數據庫之間的數據的需求。在實現的時候,會判斷產品名稱是否一樣。

前提:他們習慣使用中文環境。

發現問題:明明form視圖上顯示的產品名稱一樣,同步的時候總是提示,產品名稱不一樣。(視圖上已經排除中英文翻譯不一致的問題)

二、排查經過

追根溯源: 查詢數據庫,發現數據庫中存儲的name跟視圖上顯示的name不一樣。
視圖上顯示:7439-95-4/鎂塊(xie)
數據中存儲:7439-95-4/鎂屑
在這里插入圖片描述
數據查詢:
如下圖:form視圖上顯示都是:7439-95-4/鎂塊(xie)
我把左邊的叫 A 數據庫的;右邊叫做 B 數據庫的。
該產品在 A 數據庫中的產品id是5585,在 B 數據庫中的產品id是13。
如下圖:B 數據庫中顯示的存儲值是:7439-95-4/鎂屑
在這里插入圖片描述

修改思路: 是從A同步到B,所以后續修改都是看怎么把B中的產品名稱改成跟A一樣的。

1. 問 deepseek

在這里插入圖片描述
在這里插入圖片描述
根據上面建議查詢如下:
兩個數據庫中的翻譯值不一樣,form視圖顯示的都是翻譯模型中value的值,所以看到的結果是一樣的。繼續查詢產品的name看看:
上面是A數據庫的翻譯值,下面是B數據庫的翻譯值。
在這里插入圖片描述

解釋說明:這里提前說下后面的經驗成果,利于后續的理解。 ir.translation
模型中我們用到的兩個比較重要的字段:src,value。
src: 是視圖上根據當前語言輸入的原始值 。
value: 是視圖上顯示的翻譯的值

sql 查詢B數據庫中產品的name,發現跟譯文中的 src 一樣
在這里插入圖片描述
總結: 數據庫中存儲的產品name值跟翻譯中src的值一樣,但form視圖上顯示的是 value的值。
在這里插入圖片描述

通過deepseek提供的方法,修改了譯文中的 src 的值后,修改代碼如下:

	#  如果翻譯中存儲的源跟顯示的產品名不一樣,就修改所有翻譯中源值和翻譯的值def fix_name(self):self.ensure_one()# 獲取當前翻譯記錄translations = self.env['ir.translation'].search([('name', '=', 'product.template,name'),('res_id', '=', self.id)])if translations:# 如果數據庫name與翻譯src不同,統一為數據庫namefor t in translations:if self.name != t.src:t.write({'src': self.name, 'value': self.name})

修改后效果如下:
(這種解決了,視圖上顯示名和數據庫不一致的問題)
在這里插入圖片描述
ps:解決所有有問題的數據同理。

2. 驗證

在英文語言環境下,修改B數據庫中該產品的name,發現,英文譯文下的 src, value都同步更新后面加了22,其中zh_CN語言下的 src 值也跟著改變了,但是zh_CN狀態下的value值沒有改變。
在這里插入圖片描述
如圖,只修改B數據庫中form視圖上中文翻譯的值,發現只有zh_CN語言下的value值變了。數據庫結果如下:
在這里插入圖片描述

3. 新問題

通過上述修正后,發現B數據中的產品name還是沒有修改過來,通過 ilike 找到這個產品,id是11。
在這里插入圖片描述
在這里插入圖片描述

后來查了創建時間發現,產品11和13原來是同名的,后來11歸檔了,但是13中的name總是跟著11來的,最后在英文環境下修改了11的產品名稱,再修改產品11的翻譯,這樣同步不會出問題了。

完成同步后,把產品11的name又改回去了。

三、 總結

  1. 如果遇到已有數據存在產品現實名稱跟數據庫查詢名稱不一樣的問題,多半是多語言翻譯的問題;
  2. ir.translation 模型中src 是在當前語言狀態下輸入的源值;value是翻譯的值,是當前語言環境下顯示在form視圖上的值;
  3. 英文狀態下修改name值,會同步修改英文狀態下翻譯中的src和value的值,以及中文狀態下的src值,但是不會修改中文下的翻譯的值,也就是中文下form視圖下顯示的值,需要手動修改;
  4. 如果遇到復制的產品,通過上述還是不一樣,則需要修改源頭產品的name(原因不知道為啥)

四、補充(翻譯模型 ir.translationsrcvalue 字段詳解)

(以下為deepseek回答,供參考)

在 Odoo 的多語言系統中,ir.translation 模型負責存儲所有可翻譯內容的翻譯記錄,其中 srcvalue
是兩個核心字段:

一、字段定義

  1. src 字段

    • 含義:源文本(Source Text)
    • 作用:存儲原始語言的文本內容
    • 特點
      • 這是需要被翻譯的原始字符串
      • 通常是創建記錄時最初使用的語言文本(如英文)
      • 作為查找翻譯的"鍵"(與nameres_id等字段組合形成唯一鍵)
  2. value 字段

    • 含義:翻譯值(Translated Value)
    • 作用:存儲目標語言的翻譯文本
    • 特點
      • 當此字段有值時,系統會優先顯示這個翻譯內容
      • 如果此字段為空,系統會回退顯示src的內容
      • 可以存儲不同語言對同一src的不同翻譯

二、工作流程示例

假設原始產品用英文創建,然后翻譯為中文:

  1. 創建產品時: python product = env['product.template'].create({'name': 'Magnesium block'})

    • 數據庫 product.template 表中的 name: “Magnesium block”
    • 此時 ir.translation 尚無記錄
  2. 添加中文翻譯后:

    • ir.translation 記錄:
      • src: “Magnesium block” (原始文本)
      • value: “鎂塊” (中文翻譯)
      • lang: “zh_CN” (目標語言)

三、重要行為特點

  1. 顯示優先級

    • 系統會優先顯示value字段的內容(如果存在且當前語言匹配)
    • 如果value為空或語言不匹配,則顯示src內容
    • 如果都為空,則顯示數據庫字段的原始值
  2. 數據一致性

    • 理想情況下,src應該與數據庫中原始記錄的字段值保持一致
    • 但實踐中可能出現不一致(如直接更新數據庫字段未同步翻譯表)
  3. 導入/導出影響

    • 通過 Odoo 界面導出翻譯時,導出的是srcvalue的映射
    • 直接數據庫操作可能繞過翻譯機制

四、 典型問題場景

您遇到的場景解釋:

  • 數據庫 product.template.name = “7439-95-4/鎂屑”(當前值)
  • 翻譯表中 src = “7439-95-4/鎂塊(xie)”(舊值) 這表明:
  1. 產品名稱曾被修改過(從"鎂塊(xie)“改為"鎂屑”)
  2. 但修改操作沒有同步更新翻譯表中的src字段
  3. 系統可能仍在使用舊的翻譯記錄

五、 最佳實踐建議

  1. 修改數據時

    • 始終通過標準API(如write()方法)修改可翻譯字段
    • 避免直接SQL更新
  2. 數據同步python # 當修改可翻譯字段時,同步更新翻譯記錄 product.write({'name': '新名稱'}) translations = env['ir.translation'].search([ ('name', '=', 'product.template,name'), ('res_id', '=', product.id) ]) translations.write({'src': '新名稱'})

  3. 查詢數據時

    • 如需獲取原始值,直接查詢模型字段
    • 如需獲取翻譯值,使用with_context(lang=lang)display_name字段

理解srcvalue的區別對于解決Odoo多語言系統中的顯示問題至關重要,特別是在處理數據遷移或自定義模塊開發時。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76985.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

充電寶項目:規則引擎Drools學習

文章目錄 規則引擎 Drools1 問題2 規則引擎概述2.1 規則引擎2.2 使用規則引擎的優勢2.3 規則引擎應用場景2.4 Drools介紹 3 Drools入門案例3.1 創建springboot項目 引入依賴3.2 添加Drools配置類3.4 創建實體類Order3.5 orderScore.drl3.6 編寫測試類 4 Drools基礎語法4.1 規則…

HTML、CSS 和 JavaScript 常見用法及使用規范

一、HTML 深度剖析 1. 文檔類型聲明 HTML 文檔開頭的 <!DOCTYPE html> 聲明告知瀏覽器當前文檔使用的是 HTML5 標準。它是文檔的重要元信息&#xff0c;能確保瀏覽器以標準模式渲染頁面&#xff0c;避免怪異模式下的兼容性問題。 2. 元數據標簽 <meta> 標簽&am…

基于CNN+ViT的蔬果圖像分類實驗

本文只是做一個簡單融合的實驗&#xff0c;沒有任何新穎&#xff0c;大家看看就行了。 1.數據集 本文所采用的數據集為Fruit-360 果蔬圖像數據集&#xff0c;該數據集由 Horea Mure?an 等人整理并發布于 GitHub&#xff08;項目地址&#xff1a;Horea94/Fruit-Images-Datase…

Ubuntu24.04安裝libgl1-mesa-glx 報錯,軟件包缺失

在 Ubuntu 24.04 系統中&#xff0c;您遇到的 libgl1-mesa-glx 軟件包缺失問題可能是由于該包在最新的 Ubuntu 版本中被重命名為 libglx-mesa0。以下是針對該問題的詳細解決方案&#xff1a; 1. 問題原因分析 包名稱變更&#xff1a;在 Ubuntu 24.04 中&#xff0c;libgl1-me…

webpack vite

? 1、webpack webpack打包工具&#xff08;重點在于配置和使用&#xff0c;原理并不高優。只在開發環境應用&#xff0c;不在線上環境運行&#xff09;&#xff0c;壓縮整合代碼&#xff0c;讓網頁加載更快。 前端代碼為什么要進行構建和打包&#xff1f; 體積更好&#x…

如何在爬蟲中合理使用海外代理?在爬蟲中合理使用海外ip

我們都知道&#xff0c;爬蟲工作就是在各類網頁中游走&#xff0c;快速而高效地采集數據。然而如果目標網站分布在多個國家或者存在區域性限制&#xff0c;那靠普通的網絡訪問可能會帶來諸多阻礙。而這時&#xff0c;“海外代理”儼然成了爬蟲工程師們的得力幫手&#xff01; …

數據倉庫分層存儲設計:平衡存儲成本與查詢效率

數據倉庫分層存儲不僅是一個技術問題,更是一種藝術:如何在有限的資源下,讓數據既能快速響應查詢,又能以最低的成本存儲? 目錄 一、什么是數據倉庫分層存儲? 二、分層存儲的體系架構 1. 數據源層(ODS,Operational Data Store) 2. 數據倉庫層(DW,Data Warehouse)…

YOLO學習筆記 | 基于YOLOv8的植物病害檢測系統

以下是基于YOLOv8的植物病害檢測系統完整技術文檔,包含原理分析、數學公式推導及代碼實現框架。 基于YOLOv8的智能植物病害檢測系統研究 摘要 針對傳統植物病害檢測方法存在的效率低、泛化性差等問題,本研究提出一種基于改進YOLOv8算法的智能檢測系統。通過設計輕量化特征提…

高級語言調用C接口(二)回調函數(4)Python

前面2篇分別說了java和c#調用C接口&#xff0c;參數為回調函數&#xff0c;回調函數中參數是結構體指針。 接下來說下python的調用方法。 from ctypes import * import sysclass stPayResult(Structure):_pack_ 4 # 根據實際C結構體的對齊方式設置&#xff08;常見值為1,4,…

springboot啟動動態定時任務

1.自定義定時任務線程池 package com.x.devicetcpserver.global.tcp.tcpscheduler;import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotatio…

pytorch框架認識--手寫數字識別

手寫數字是機器學習中非常經典的案例&#xff0c;本文將通過pytorch框架&#xff0c;利用神經網絡來實現手寫數字識別 pytorch中提供了手寫數字的數據集&#xff0c;我們可以直接從pytorch中下載 MNIST中包含70000張手寫數字圖像&#xff1a;60000張用于訓練&#xff0c;10000…

WPF 使用依賴注入后關閉窗口程序不結束

原因是在ViewModel中在構造函數中注入了Window 對象&#xff0c;即使沒有使用&#xff0c;主窗口關閉程序不會退出&#xff0c;即使 ViewModel 是 AddTransient 注入的。 解決方法&#xff1a;不使用構造函數注入Window&#xff0c;通過GetService獲取Window 通過注入對象調用…

用戶管理(添加和刪除,查詢信息,切換用戶,查看登錄用戶,用戶組,配置文件)

目錄 添加和刪除用戶 查詢用戶信息 切換用戶 查看當前的操作用戶是誰 查看首次登錄的用戶是誰 用戶組&#xff08;對屬于同個角色的用戶統一管理&#xff09; 新增組 刪除組 添加用戶的同時&#xff0c;指定組 修改用戶的組 組的配置文件&#xff08;/etc/group&…

PyTorch學習-小土堆教程

網絡搭建torch.nn.Module 卷積操作 torch.nn.functional.conv2d(input, weight, biasNone, stride1, padding0, dilation1, groups1) 神經網絡-卷積層

MVCC詳細介紹及面試題

目錄 1.什么是mvcc&#xff1f; 2.問題引入 3. MVCC實現原理&#xff1f; 3.1 隱藏字段 3.2 undo log 日志 3.2.1 undo log版本鏈 3.3 readview 3.3.1 當前讀 ?編輯 3.3.2 快照讀 3.3.3 ReadView中4個核心字段 3.3.4 版本數據鏈訪問的規則&#xff08;了解&#x…

企業級Active Directory架構設計與運維管理白皮書

企業級Active Directory架構設計與運維管理白皮書 第一章 多域架構設計與信任管理 1.1 企業域架構拓撲設計 1.1.1 林架構設計規范 林根域規劃原則&#xff1a; 采用三段式域名結構&#xff08;如corp.enterprise.com&#xff09;&#xff0c;避免使用不相關的頂級域名架構主…

android11 DevicePolicyManager淺析

目錄 &#x1f4d8; 簡單定義 &#x1f4d8;應用啟用設備管理者 &#x1f4c2; 文件位置 &#x1f9e0; DevicePolicyManager 功能分類舉例 &#x1f6e1;? 1. 安全策略控制 &#x1f4f7; 2. 控制硬件功能 &#x1f9f0; 3. 應用管理 &#x1f512; 4. 用戶管理 &am…

Java學習手冊:Java線程安全與同步機制

在Java并發編程中&#xff0c;線程安全和同步機制是確保程序正確性和數據一致性的關鍵。當多個線程同時訪問共享資源時&#xff0c;如果不加以控制&#xff0c;可能會導致數據不一致、競態條件等問題。本文將深入探討Java中的線程安全問題以及解決這些問題的同步機制。 線程安…

PyTorch核心函數詳解:gather與where的實戰指南

PyTorch中的torch.gather和torch.where是處理張量數據的關鍵工具&#xff0c;前者實現基于索引的靈活數據提取&#xff0c;后者完成條件篩選與動態生成。本文通過典型應用場景和代碼演示&#xff0c;深入解析兩者的工作原理及使用技巧&#xff0c;幫助開發者提升數據處理的靈活…

聲學測溫度原理解釋

已知聲速&#xff0c;就可以得到溫度。 不同溫度下的勝訴不同。 25度的聲速大約346m/s 絕對溫度-273度 不同溫度下的聲速。 FPGA 通過測距雷達測溫度&#xff0c;固定測量距離&#xff0c;或者可以測出當前距離。已知距離&#xff0c;然后雷達發出聲波到接收到回波的時間&a…