2016-07-04 4 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 в набор. Нельзя использовать в 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) заменяет все существующие записи в наборе списком идентификаторов, что эквивалентно использованию команды 5, за которой следует команда 4 для каждого id в идентификаторах. Нельзя использовать в One2many. –

+0

Что вы внедрили в свой код, пожалуйста, покажите нам. –

+0

Я обновил ответ, пожалуйста, попробуйте это. Значение должно быть списком кортежей, например [(6,0, categs)] –

Смежные вопросы