Openerp v7 API 函数字段 'one2many' 类型
Openerp v7 API function field 'one2many' type
单击树视图记录时,我想打开表单视图。当打开该窗体视图时,我有两个需要动态填充的 one2many 字段(在我的例子中,我有一个产品列表,点击一个产品我想搜索该产品有多少库存移动)
def get_last_sales(self, cr, uid, ids, context=None):
customer_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'customer')])
result = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', ids), ('location_dest_id', '=', customer_loc_id)])
print result
#raise Exception
return result
def get_last_productions(self, cr, uid, ids, context=None, args=None, kwargs=None):
production_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'production')])
result = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', ids), ('location_dest_id', '=', production_loc_id)])
return result
我想要的是与 fields.function
字段类似的功能。这应该有效,但没有:
'last_sales':fields.function(_get_last_sales, type='one2many', relation='stock.move', readonly=True, store=store_triggers)
Server Traceback (most recent call last):
File "/home/george/odoo/mattia_v7/openerp/addons/web/session.py", line 89, in send
return openerp.netsvc.dispatch_rpc(service_name, method, args)
File "/home/george/odoo/mattia_v7/openerp/netsvc.py", line 296, in dispatch_rpc
result = ExportService.getService(service_name).dispatch(method, params)
File "/home/george/odoo/mattia_v7/openerp/service/web_services.py", line 626, in dispatch
res = fn(db, uid, *params)
File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 190, in execute_kw
return self.execute(db, uid, obj, method, *args, **kw or {})
File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 132, in wrapper
return f(self, dbname, *args, **kwargs)
File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 199, in execute
res = self.execute_cr(cr, uid, obj, method, *args, **kw)
File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 187, in execute_cr
return getattr(object, method)(cr, uid, *args, **kw)
File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 3718, in read
result = self._read_flat(cr, user, select, fields, context, load)
File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 3841, in _read_flat
res2 = self._columns[f].get(cr, self, ids, f, user, context=context, values=res)
File "/home/george/odoo/mattia_v7/openerp/osv/fields.py", line 1152, in get
result = self._fnct(obj, cr, uid, ids, name, self._arg, context)
File "/home/george/odoo/mattia_v7/openerp/addons/product/product.py", line 461, in _product_lst_price
res[product.id] = product.list_price
File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 503, in __getattr__
return self[name]
File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 469, in __getitem__
elif field_column._type in ('one2many', 'many2many') and len(result_line[field_name]):
TypeError: object of type 'bool' has no len()
我可以在 https://www.odoo.com/forum/help-1/question/can-i-store-field-function-with-the-type-one2many-356
上看到
这似乎不受支持。
那里的答案正确吗?有什么解决方法吗?
尝试使用以下代码:
def get_last_sales(self, cr, uid, ids, context=None):
customer_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'customer')])
result = {}
if customer_loc_id:
for record in self.browse(cr, uid, ids):
result[record.id] = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', record.id), ('location_dest_id', '=', customer_loc_id[0])])
return result
def get_last_productions(self, cr, uid, ids, context=None, args=None, kwargs=None):
production_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'production')])
result = {}
if production_loc_id:
for record in self.browse(cr, uid, ids):
result[record.id] = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', record.id), ('location_dest_id', '=', production_loc_id[0])])
return result
'last_sales':fields.function(_get_last_sales, type='one2many', relation='stock.move', readonly=True, string='Last Sales')
是的,存储 x2many 函数或计算字段根本没有意义。为什么?这两种类型都需要一些特殊的设置,这不能在字段定义上进行。在 one2many 上,您需要另一个模型上的相关外键。在 many2many 上,您必须为两个模型键定义 table。
我使用 odoo 的经验表明:使用未存储的 many2many 函数字段(函数需要 return 其常用字典中的 id 列表)。
另外,正如@Odedra 在他的回答中提到的那样,您的函数不正确。
单击树视图记录时,我想打开表单视图。当打开该窗体视图时,我有两个需要动态填充的 one2many 字段(在我的例子中,我有一个产品列表,点击一个产品我想搜索该产品有多少库存移动)
def get_last_sales(self, cr, uid, ids, context=None):
customer_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'customer')])
result = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', ids), ('location_dest_id', '=', customer_loc_id)])
print result
#raise Exception
return result
def get_last_productions(self, cr, uid, ids, context=None, args=None, kwargs=None):
production_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'production')])
result = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', ids), ('location_dest_id', '=', production_loc_id)])
return result
我想要的是与 fields.function
字段类似的功能。这应该有效,但没有:
'last_sales':fields.function(_get_last_sales, type='one2many', relation='stock.move', readonly=True, store=store_triggers)
Server Traceback (most recent call last):
File "/home/george/odoo/mattia_v7/openerp/addons/web/session.py", line 89, in send
return openerp.netsvc.dispatch_rpc(service_name, method, args)
File "/home/george/odoo/mattia_v7/openerp/netsvc.py", line 296, in dispatch_rpc
result = ExportService.getService(service_name).dispatch(method, params)
File "/home/george/odoo/mattia_v7/openerp/service/web_services.py", line 626, in dispatch
res = fn(db, uid, *params)
File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 190, in execute_kw
return self.execute(db, uid, obj, method, *args, **kw or {})
File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 132, in wrapper
return f(self, dbname, *args, **kwargs)
File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 199, in execute
res = self.execute_cr(cr, uid, obj, method, *args, **kw)
File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 187, in execute_cr
return getattr(object, method)(cr, uid, *args, **kw)
File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 3718, in read
result = self._read_flat(cr, user, select, fields, context, load)
File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 3841, in _read_flat
res2 = self._columns[f].get(cr, self, ids, f, user, context=context, values=res)
File "/home/george/odoo/mattia_v7/openerp/osv/fields.py", line 1152, in get
result = self._fnct(obj, cr, uid, ids, name, self._arg, context)
File "/home/george/odoo/mattia_v7/openerp/addons/product/product.py", line 461, in _product_lst_price
res[product.id] = product.list_price
File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 503, in __getattr__
return self[name]
File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 469, in __getitem__
elif field_column._type in ('one2many', 'many2many') and len(result_line[field_name]):
TypeError: object of type 'bool' has no len()
我可以在 https://www.odoo.com/forum/help-1/question/can-i-store-field-function-with-the-type-one2many-356
上看到这似乎不受支持。 那里的答案正确吗?有什么解决方法吗?
尝试使用以下代码:
def get_last_sales(self, cr, uid, ids, context=None):
customer_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'customer')])
result = {}
if customer_loc_id:
for record in self.browse(cr, uid, ids):
result[record.id] = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', record.id), ('location_dest_id', '=', customer_loc_id[0])])
return result
def get_last_productions(self, cr, uid, ids, context=None, args=None, kwargs=None):
production_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'production')])
result = {}
if production_loc_id:
for record in self.browse(cr, uid, ids):
result[record.id] = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', record.id), ('location_dest_id', '=', production_loc_id[0])])
return result
'last_sales':fields.function(_get_last_sales, type='one2many', relation='stock.move', readonly=True, string='Last Sales')
是的,存储 x2many 函数或计算字段根本没有意义。为什么?这两种类型都需要一些特殊的设置,这不能在字段定义上进行。在 one2many 上,您需要另一个模型上的相关外键。在 many2many 上,您必须为两个模型键定义 table。
我使用 odoo 的经验表明:使用未存储的 many2many 函数字段(函数需要 return 其常用字典中的 id 列表)。
另外,正如@Odedra 在他的回答中提到的那样,您的函数不正确。