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.mzph.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…