Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取产品&x27;OpenERP中本地语言中的姓名?_Python_Odoo_Xmlrpclib - Fatal编程技术网

Python 获取产品&x27;OpenERP中本地语言中的姓名?

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

这是一个非常简单但很难回答的问题,因为我认为只有“少数”人能够处理这个问题

我有一个简单的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, 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
class
expression
method
parse
。当您调用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吗?