2016-07-04 136 views
0

对于我的用例,我试图在创建时将所有产品类别列表添加到联系人。将列表添加到one2many

class product_category(models.Model): 
      _inherit = "product.category" 
      is_checked = fields.Boolean('Don', help="Check this box if this contact make Donation.") 
      resRelId = fields.Many2one('res.partner') 

class res_partner(models.Model): 
     _inherit = "res.partner" 
     categs = fields.One2many('product.category','resRelId',String='Halo') 
     @api.model 
    def create(self, values): 
     categs = self.env['product.category'].search([]) 
     new_id = super(res_partner, self).create(values) 
     for i in categs: 
      _logger.error(i) 
      new_id.write({'categs': i}) 
     _logger.error(new_id.categs) 
     return new_id 

我的代码编译没有任何错误,但我一直在接触一个空的产品列表结束了和我得到的警告。

2016-07-04 17:54:46,777 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(1,) == 1 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:800) 
2016-07-04 17:54:46,777 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(1,) == 2 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:802) 
2016-07-04 17:54:46,777 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(1,) == 3 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:804) 
2016-07-04 17:54:46,777 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(1,) == 4 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:812) 
2016-07-04 17:54:46,777 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(1,) == 5 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:818) 
2016-07-04 17:54:46,778 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(1,) == 6 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:831) 
2016-07-04 17:54:46,778 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(3,) == 1 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:800) 
2016-07-04 17:54:46,778 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(3,) == 2 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:802) 
2016-07-04 17:54:46,778 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(3,) == 3 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:804) 
2016-07-04 17:54:46,778 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(3,) == 4 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:812) 
2016-07-04 17:54:46,778 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(3,) == 5 (/home/odoo/odoo-dev/odoo/openerp/osv/fields.py:818) 
2016-07-04 17:54:46,778 17751 WARNING v8dev openerp.models: Comparing apples and oranges: product.category(3,) == 6 (/home/odoo/odoo- 

回答

0

您正在尝试写入one2many字段。这不是你写给One2many的方式。

这是添加和从one2many删除的各种方式方便的技巧:

(0, 0, { values }) link to a new record that needs to be created with the given values dictionary 
(1, ID, { values }) update the linked record with id = ID (write *values* on it) 
(2, ID)    remove and delete the linked record with id = ID (calls unlink on ID, that will delete the object completely, and the link to it as well) 
(3, ID)    cut the link to the linked record with id = ID (delete the relationship between the two objects but does not delete the target object itself) 
(4, ID)    link to existing record with id = ID (adds a relationship) 
(5)     unlink all (like using (3,ID) for all linked records) 
(6, 0, [IDs])   replace the list of linked IDs (like using (5) then (4,ID) for each ID in the list of IDs) 

你的情况,这样做的正确的方法是:

def create(self, values): 
    categs = self.env['product.category'].search([]) 
    new_id = super(res_partner, self).create(values) 
    for i in categs: 
     _logger.error(i) 
     new_id.write({'categs': (4,i.id)}) 
    _logger.error(new_id.categs) 
    return new_id 
+0

我有'TypeError:'int'对象没有属性'__getitem __''。而且,我认为我不能使用(4,ID)。 从Odoo 8文档: (4,id,_)将id id的现有记录添加到集合中。 One2many无法使用。 –

0

有一个最简单的这样做的方法。

@api.model 
def create(self, values): 
    ## Here categ is a list containing category ids. 
    categs = self.env['product.category'].search([]).ids 
    values.update({'categs':[(6, 0, categs or [])]}) 
    return super(res_partner, self).create(values) 
+0

同样的事情,我有TypeError:'int'对象没有属性'__getitem __'。我不能使用(6,ID)。从Odoo 8文档:(6,_,ids)用id列表替换集合中的所有现有记录,相当于使用命令5,然后在id中为每个id命令4。 One2many无法使用。 –

+0

你在你的代码中实现了什么,请告诉我们。 –

+0

我已更新答案,请尝试此操作。值应该是元组列表,例如[(6,0,categs)] –