Python Openerp 7正在将文本传递给db ID
我现在有一个我不明白的问题。创建供应商订单时出现问题。用户正在传递products,它在openerp server/addons/purchase/purchase.py类中调用“onchange\u product\u id”。在这个方法中,它调用类product.product的方法name_get(文件openerp server/addons/product/product.py)来获取供应商设置的产品名称 onchange方法如下所示Python Openerp 7正在将文本传递给db ID,python,openerp-7,Python,Openerp 7,我现在有一个我不明白的问题。创建供应商订单时出现问题。用户正在传递products,它在openerp server/addons/purchase/purchase.py类中调用“onchange\u product\u id”。在这个方法中,它调用类product.product的方法name_get(文件openerp server/addons/product/product.py)来获取供应商设置的产品名称 onchange方法如下所示 def onchange_product_id(
def onchange_product_id(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id,
partner_id, date_order=False, fiscal_position_id=False, date_planned=False,
name=False, price_unit=False, context=None):
....
dummy, name = self.pool.get('product.product').name_get(cr, uid, product_id, context=context_partner)[0]
在name_get(在model product.product中)中的几行之后,执行以下代码
for product in self.browse(cr, user, ids, context=context):
sellers = partner_ids and filter(lambda x: x.name.id in partner_ids, product.seller_ids) or []
这引发了一个意外的例外,如下所示
openerp.sql_db: bad query: SELECT product_product."product_tmpl_id",product_product.id FROM "product_product" WHERE product_product.id IN ('Allzweckreiniger', 13484) ORDER BY default_code,name_template
Traceback (most recent call last):
File "/opt/openerp/openerp-server/openerp/sql_db.py", line 226, in execute
res = self._obj.execute(query, params)
DataError: invalid input syntax for integer: "Allzweckreiniger"
LINE 1: ...OM "product_product" WHERE product_product.id IN ('All...
我不是python极客,但我已经习惯了,所以请不要从初学者指南开始,只要它没有说明我的问题
关于上述问题,我有四个问题:
- openerp是如何将product_product.name“Allzweckreiniger”传递到数据库id字段的?13484是数据集的正确对应id,因此传递这两个值
- 未捕获的异常发生在卖家行中,而不是浏览。是什么导致卖方产品线中的产品选择
- 为什么它发生在那里而不是像我现在理解的那样在浏览中,浏览已经直接解决了所有许多关系
- 最后一点:给定的产品在表product.supplierinfo中没有设置供应商,为什么它在此时访问db
for product in self.browse(cr, user, ids, context=context):
sellers = self.pool['product.supplierinfo'].search(cr, user, [('product_id', '=', product.product_tmpl_id.id), ('name', 'in', partner_ids)], context=context)
for seller in sellers:
s = self.pool['product.supplierinfo'].browse(cr, user, seller, context=context)
我主要关心的是理解错误选择的原因
谢谢你的帮助
2018年6月10日更新: 我又挖了一点,但还是很奇怪。以下日志是在未捕获异常发生时编写的,它发生在另外几个产品中。所有产品均未设置卖方ID
File "/opt/openerp/openerp-server/addons/purchase/purchase.py", line 1011, in onchange_product_id
dummy, name = product_product.name_get(cr, uid, product_id, context=context_partner)[0]
File "/opt/openerp/openerp-server/addons/product/product.py", line 671, in name_get
sellers = partner_ids and filter(lambda x: x.name.id in partner_ids, product.seller_ids) or []
File "/opt/openerp/openerp-server/openerp/osv/orm.py", line 503, in __getattr__
return self[name]
因此,它似乎减少了关于过滤器功能的问题。但为什么它还要执行左lambda部分呢?正确的产品卖家ID不应该只是一个空列表吗
为什么在访问产品供应商信息时会将其转储到产品产品模型上?ID的来源是什么?谢谢您的编辑。我更新了这个问题,id是从onchange方法传递过来的,并且正确地填充了一个product\u product db id,在我的例子中设置为13484,我已经检查了它是否正确地设置了一个Exception\u osvi,解决了这个问题,同时,我非常困惑。Openerp将列表传递给参数product_id和uom_id给方法onchange_product_id,其中包含db id和相应字段的name_get结果。e、 g.它正在将[13484,‘Allzweckreiniger’]传递给产品id,从而导致问题。我现在解决了这个问题,检查参数中的列表,过滤掉所有非整数值,并用找到的第一个整数值覆盖产品id。但这样做感觉很不对。在我看来,如果每个onchange方法在这里失败,那么它必须在这里发生。