Как правилно да създавам, пиша или прекратявам връзката на записи за много2много поле с помощта на новия API?

Може ли някой да ми даде пример за манипулиране на много2много поле с помощта на новия 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 новият ORM API е много по-хубав от предишния (с всички тези скучни (cr, uid, ids, ..) параметри). Едно от големите предимства за мен с този нов API е фактът, че сега работим с обекти, а не с id.

Всичко, от което се нуждаете с новите методи, е параметърът 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