У меня есть текущая проблема, которую я не понимаю.Проблема возникает при создании заказа поставщика.Пользователь передает продукты, которые вызывают "onchange_product_id" в классе openerp-server / addons / purchase / purchase.py.В этом методе он вызывает метод name_get класса product.product (файл openerp-server / addons / product / product.py), чтобы получить имя продукта, установленное поставщиком.
Метод onchange выглядит следующим образом
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 (в модели 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" в поле идентификатора базы данных?13484 является правильным соответствующим идентификатором набора данных, поэтому оба значения передаются
- Неисследованное исключение происходит в строке продавца, а не в просмотре.Что вызывает выбор для product_product в строке продавца?
- Почему это происходит там, а не в просмотре, как я понимал до сих пор, что просмотр уже разрешает все многие отношения напрямую
- И последнее: у данного продукта нет поставщика, указанного в таблице product.supplierinfo, почему он вообще обращается к этой базе данных?
Проблема возникла дважды на одном и том же продуктеи тот же самый заказ в течение нескольких минут у моего клиента, а затем уже никогда.Я не нашел время поговорить с человеком напрямую, так что это все, что у меня есть.К сожалению, я не смог воспроизвести это вообще.
Поскольку фильтр сводит наборы данных product.supplierinfo только к одному набору данных, соответствующему текущему поставщику, если он есть, я в настоящее время изменил код на следующий, чтобы избежать каких-либо дополнительныхвыбор в фоновом режиме
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)
Моя главная задача - понять, что вызывает неправильный выбор.
Спасибо за любую помощь
обновление 10.06.2018:
Я копал немного дальше, но это все еще странно.Следующий журнал написан при возникновении неисследованного исключения, и это произошло с еще несколькими продуктами.Для всех продуктов не заданы seller_ids.
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]
, поэтому проблема с функцией фильтра уменьшается.Но почему он выполняет левую лямбда-часть?Разве правильные product.seller_ids не должны быть просто пустым списком?
И почему тогда происходит демпинг на модель product_product при доступе к product_supplierinfo?