Как правильно создавать, записывать или удалять записи для поля many2many с помощью нового API?

Может ли кто-нибудь дать мне пример для управления полем many2many с использованием нового API? Я безуспешно пытался прочитать документацию.

Вот мои примеры классов:

from openerp import models, fields, api, _

class example_class_one(models.Model):

    _name           = "example.class.one"

    name           = fields.Char('Name')
    value          = fields.Float('Value')

example_class_one()

class example_class_two(models.Model):

    _name           = "example.class.two"

    name                = fields.Char('Name')
    example_class_ones  = fields.Many2many('example.class.one',string='Example Class Ones')

    @api.one
    def test(self):
        #CREATES SOME example_class_ones and assign them to self
        #MANIPULATE SOME example_class_ones and save them
        #DELETE SOME example_class_ones from self
        pass

example_class_two()

person William Wino    schedule 07.09.2015    source источник


Ответы (2)


В Odoo 8 новый API ORM намного лучше предыдущего (со всеми этими скучными параметрами (cr, uid, ids, ..)). Одним из больших преимуществ этого нового API для меня является тот факт, что теперь мы работаем с объектами, а не с идентификаторами.

Все, что вам нужно для новых методов, — это параметр self. Вы можете перебирать его - это, помимо прочего, также коллекция объектов odoo.

А еще есть одна волшебная переменная — self.env типа Environment, содержащая все эти cr, uid, etc. штуки. Также содержит коллекцию всех известных моделей - это то, что вам нужно.

Так почему бы вам не попробовать так:

@api.one
def test(self):
    model_one = self.env['example.class.one']
    model_one.create({'name': 'Some ONE object', 'value': 2.0})
    ones = model_one.browse([1, 3, 5])
    ones2 = model_one.search([('name', '=', 'Some name')])
    # You can imagine - search() return also objects! :)
    ones2[0].unlink()
    # Or, to deal with you many2many field...
    self.example_class_ones += model_one.new({
        'name': 'New comer to the many2many relation',
        'value': 666.0})

Надеюсь, это ответит на ваш вопрос.

person Andrei Boyanov    schedule 08.09.2015
comment
я могу сделать это: self.example_class_ones.delete() чтобы удалить все example_class_ones в себе? - person William Wino; 09.09.2015
comment
Я получил эту ошибку AttributeError: 'example.class.one' object has no attribute 'delete' - person William Wino; 09.09.2015
comment
Потому что это не удаление, это unlink(). Извините за эту ошибку. Я исправляю ответ сейчас. - person Andrei Boyanov; 09.09.2015
comment
Благодарю вас! Вы были очень полезны. Если вы не возражаете, вы можете попытаться ответить на другой мой вопрос, этот, я думаю, сложнее. Просто взгляните на этот stackoverflow.com/ вопросы/32475648/ - person William Wino; 09.09.2015

Вы можете обратиться к моему делу, как показано ниже, либо на @api

@api.onchange('opportunity_id')
    def _get_description(self):
        if self.opportunity_id.id:
            self.x_description = self.opportunity_id.x_description 

или объявить как отношение установки и поле (связанное) как ссылку ниже

Передача значений настраиваемых полей из oppertunity к цитате в odoo 10

person chau ho    schedule 27.05.2017