Python 获取产品&x27;OpenERP中本地语言中的姓名?
这是一个非常简单但很难回答的问题,因为我认为只有“少数”人能够处理这个问题 我有一个简单的Python脚本:Python 获取产品&x27;OpenERP中本地语言中的姓名?,python,odoo,xmlrpclib,Python,Odoo,Xmlrpclib,这是一个非常简单但很难回答的问题,因为我认为只有“少数”人能够处理这个问题 我有一个简单的Python脚本: import xmlrpclib username = 'my_openerp_user' pwd = 'my_password' dbname = 'my_openerp_database' sock = xmlrpclib.ServerProxy('http://localhost:8063/xmlrpc/common') uid = sock.login(dbname, use
import xmlrpclib
username = 'my_openerp_user'
pwd = 'my_password'
dbname = 'my_openerp_database'
sock = xmlrpclib.ServerProxy('http://localhost:8063/xmlrpc/common')
uid = sock.login(dbname, username, pwd)
sock = xmlrpclib.ServerProxy('http://localhost:8063/xmlrpc/object')
args = [('name', 'ilike', 'my_product')]
ids = sock.execute(dbname, uid, pwd, 'product.product', 'search', args)
print ids
它应该在OpenERP数据库中找到名为“my_product”的所有产品,但它没有。我知道为什么:
我所在的国家不讲英语,所以我在OpenERP中安装了一种语言,xmlrpc的“搜索”功能是寻找名为“my_product”但仅使用英语的产品。问题是显然没有一个字段来保存翻译后的名称。。。它似乎也是“名字”!因此,如果我用我的语言指定产品名称,我就找不到这些产品
世界上有人有同样的问题吗
编辑
context = {'lang': 'es_ES'}
args = [('name', 'ilike', 'my_product')] # consulta
ids = sock.execute(dbname, uid, pwd, 'product.product', 'search', args, context)
好的,我有一个线索:如果我不做“搜索”,而是做“阅读”:
product_names = sock.execute(dbname, uid, pwd, 'product.product', 'read', ids, ['name'], {'lang': 'es_ES'})
这样,我可以指定语言,它的工作!但我不能用“搜索”做同样的事情,我会出错。有人知道路吗
新编辑
context = {'lang': 'es_ES'}
args = [('name', 'ilike', 'my_product')] # consulta
ids = sock.execute(dbname, uid, pwd, 'product.product', 'search', args, context)
我几乎可以肯定,如果您在
上下文中传递lang
,它应该会起作用
例如:context={'lang':u'pl\u pl'}
如果不起作用,您应该尝试覆盖名称搜索方法。搜索方法如下:
search(cr, uid, args, offset=0, limit=None, order=None, context=None, count=False)
如果要发送上下文,还必须在args和context之间发送参数:
ids = sock.execute(dbname, uid, pwd, 'product.product', 'search', args, 0, 0, False, context)
在openerp/osv/expression.py中,查询已重新格式化,仅当ir_translation中不存在翻译时,才搜索翻译,并搜索英文原名。
OpenERP服务器6.0.4
query1 = '( SELECT res_id' \
' FROM ir_translation' \
' WHERE name = %s' \
' AND lang = %s' \
' AND type = %s'
instr = ' %s'
#Covering in,not in operators with operands (%s,%s) ,etc.
if operator in ['in','not in']:
instr = ','.join(['%s'] * len(right))
query1 += ' AND value ' + operator + ' ' +" (" + instr + ")" + ')'
else:
query1 += ' AND value ' + operator + instr + ')'
query1 +=' UNION (' \
' SELECT id' \
' FROM "' + working_table._table + '"' + ' as wt ' \
' WHERE "'+ left + '" ' + operator + instr + \
' AND NOT EXISTS ( ' \
' SELECT res_id FROM ir_translation ' \
' WHERE wt.id = res_id ' \
' AND name = %s' \
' AND lang = %s' \
' AND type = %s)' + ")"
query2 = [working_table._name + ',' + left,
context.get('lang', False) or 'en_US',
'model',
right,
right,
working_table._name + ',' + left,
context.get('lang', False) or 'en_US',
'model'
]
不是吗?看起来是的。查看expression.parse方法(在方法末尾的else块中)。对不起,我有点迷路了,我必须在哪里查找该表达式。parse?openerp/osv/expression.py
classexpression
methodparse
。当您调用search时,它将进入BaseModel.\u search()->BaseModel.\u其中\u calc()->expression.init()->expression.parse()
,并在该方法结束时从ir\u translation表中获取翻译。我知道您试图在context
中传递lang
,但它不起作用?当我使用与您在上面编写的变量“context”(我的语言)完全相同的变量时,它起作用,但仅在“read”和“create”方法中起作用。如果我在“搜索”中将“context”作为关键字参数传递,则会出现此错误,context={'lang:es_es'}TypeError:_call__()获得意外的关键字参数“context”,您能告诉我如何调用搜索吗?看起来很奇怪。你能给我看一下整个stacktrace吗?