如何从 Odoo 10 中的对象获取 ID?
How to get Id from Object in Odoo 10?
这是我的结构:
class Imprint_Location(models.Model):
_name = 'imprint.location'
name = fields.Char()
product_id = fields.Many2one('product.template')
class Imprint_Charges(models.Model):
_name = 'imprint.charge'
_rec_name = 'location_id'
product_id_c = fields.Many2one('product.template', required=True)
location_id = fields.Many2one('imprint.location', required=True)
@api.multi
@api.onchange('product_id_c', 'location_id')
def product_filter(self):
res = {}
print '\n\n-------\n\n', self, self.product_id_c, '\n\n-------\n\n'
if self.product_id_c:
res['domain'] = {'location_id': [('product_id', '=', self.product_id_c.id)]}
print res
return res
class Product_Template(models.Model):
_inherit = 'product.template'
imprint_location_ids = fields.One2many('imprint.location', 'product_id')
sale_imprint_charge_ids = fields.One2many('imprint.charge', 'product_id_c')
现在我在 product.template
中定义了一个页面,页面内部是 sale_imprint_charge_ids
,它在 <tree editable="bottom">
中,我没有 selecting product_id_c
字段[此字段也未显示在定义的树中]。
现在我的问题是,当我从我为 imprint.charge
定义的表单视图 select 时,方法 product_filter
工作正常,但是当我从 product.template
然后我收到一条错误消息
TypeError: <odoo.models.NewId object at 0x7fbb8bc21b90> is not JSON serializable
因为从 product.template
如果传递对象 <odoo.models.NewId object at 0x7fbb8bc21b90>
,所以如果打印 self.product_id_c
然后它打印 product.template(<odoo.models.NewId object at 0x7fbb8bc21b90>)
所以这是不可序列化的。我试过 self.product_id_c.ids
输出空列表 []
.
那么如何从对象获取 product.template
id 或传递 id
本身覆盖某些方法。
当创建一个全新的记录时,Odoo 会创建那个奇怪的 <odoo.models.NewId object at 0x7fbb8bc21b90>
对象。在你写完记录后,这个 id 会变成你习惯的普通 id(一个整数)。在这种情况下,您有一个函数(并非不合理地)在实际不存在此类值的时候期望一个真实的 id 值。您需要提供后备方案,例如评估 id 是否为整数并在该情况下提供替代值。尽管您的函数似乎 return 一个我不太清楚您期望发生什么的对象。如果您想修改其中一个字段的值,我会修改 self 对象的值,而不是 returning 一个对象。
你应该改进以下几点。
- res['domain'] = {'location_id': [('product_id', '=', self.product_id_c.id)]}
- return res
- 研究一些search() ORM
方法
尝试使用以下代码:
@api.multi
@api.onchange('product_id_c', 'location_id')
def product_filter(self):
res = {}
if self.product_id_c:
self.location_id = False
#search product_template in imprint.locationwith table and limit we will get only record if related record found
location_id = self.env['imprint.location'].search([('product_id', '=', self.product_id_c.id)], limit=1)
if location_id:
#location_id.ids will give you something like [2] so we need to set value as 2
self.location_id = location_id.ids[0]
编辑:
根据你的第一条评论,你需要一个相关位置的列表,然后我们应该遵循技巧。
- 移除product_filter()方法
- 在 imprint.charge 对象视图文件中添加域
例如:
<field name="location_id" domain="[('product_id', '=', product_id_c)]"/>
之后,重启Odoo服务器并升级您的自定义模块。
这是我的结构:
class Imprint_Location(models.Model):
_name = 'imprint.location'
name = fields.Char()
product_id = fields.Many2one('product.template')
class Imprint_Charges(models.Model):
_name = 'imprint.charge'
_rec_name = 'location_id'
product_id_c = fields.Many2one('product.template', required=True)
location_id = fields.Many2one('imprint.location', required=True)
@api.multi
@api.onchange('product_id_c', 'location_id')
def product_filter(self):
res = {}
print '\n\n-------\n\n', self, self.product_id_c, '\n\n-------\n\n'
if self.product_id_c:
res['domain'] = {'location_id': [('product_id', '=', self.product_id_c.id)]}
print res
return res
class Product_Template(models.Model):
_inherit = 'product.template'
imprint_location_ids = fields.One2many('imprint.location', 'product_id')
sale_imprint_charge_ids = fields.One2many('imprint.charge', 'product_id_c')
现在我在 product.template
中定义了一个页面,页面内部是 sale_imprint_charge_ids
,它在 <tree editable="bottom">
中,我没有 selecting product_id_c
字段[此字段也未显示在定义的树中]。
现在我的问题是,当我从我为 imprint.charge
定义的表单视图 select 时,方法 product_filter
工作正常,但是当我从 product.template
然后我收到一条错误消息
TypeError: <odoo.models.NewId object at 0x7fbb8bc21b90> is not JSON serializable
因为从 product.template
如果传递对象 <odoo.models.NewId object at 0x7fbb8bc21b90>
,所以如果打印 self.product_id_c
然后它打印 product.template(<odoo.models.NewId object at 0x7fbb8bc21b90>)
所以这是不可序列化的。我试过 self.product_id_c.ids
输出空列表 []
.
那么如何从对象获取 product.template
id 或传递 id
本身覆盖某些方法。
当创建一个全新的记录时,Odoo 会创建那个奇怪的 <odoo.models.NewId object at 0x7fbb8bc21b90>
对象。在你写完记录后,这个 id 会变成你习惯的普通 id(一个整数)。在这种情况下,您有一个函数(并非不合理地)在实际不存在此类值的时候期望一个真实的 id 值。您需要提供后备方案,例如评估 id 是否为整数并在该情况下提供替代值。尽管您的函数似乎 return 一个我不太清楚您期望发生什么的对象。如果您想修改其中一个字段的值,我会修改 self 对象的值,而不是 returning 一个对象。
你应该改进以下几点。
- res['domain'] = {'location_id': [('product_id', '=', self.product_id_c.id)]}
- return res
- 研究一些search() ORM 方法
尝试使用以下代码:
@api.multi
@api.onchange('product_id_c', 'location_id')
def product_filter(self):
res = {}
if self.product_id_c:
self.location_id = False
#search product_template in imprint.locationwith table and limit we will get only record if related record found
location_id = self.env['imprint.location'].search([('product_id', '=', self.product_id_c.id)], limit=1)
if location_id:
#location_id.ids will give you something like [2] so we need to set value as 2
self.location_id = location_id.ids[0]
编辑:
根据你的第一条评论,你需要一个相关位置的列表,然后我们应该遵循技巧。
- 移除product_filter()方法
- 在 imprint.charge 对象视图文件中添加域
例如:
<field name="location_id" domain="[('product_id', '=', product_id_c)]"/>
之后,重启Odoo服务器并升级您的自定义模块。