Как получить значение динамического поля many2many в функции create ()

Я хочу получить значение из динамически заполняемого поля many2many в функции create (), но я получаю такой результат [[6, False, [98]]], 98 на самом деле является ожидаемым результатом, хотя это мой код ниже

class CustomTransRequest(models.Model):
    _name = 'custom.trans.request'
    _description = 'Transfer Request'

    branch_from_id = fields.Many2one('custom.branch', string="From", required=True)
    branch_to_id = fields.Many2one('custom.branch', string="To", required=True)
    line_id = fields.Many2one('custom.branch.line', string="Products", required=True)
    product_id = fields.Many2many('custom.product', required=False, )
    qty = fields.Integer(string="Qty", required=True)

    @api.onchange('line_id')
    def onchange_line(self):
        if self.line_id:
            for rec in self:
                selected_products = rec.env['custom.branch.line'].search(
                    [('id', '=', rec.line_id.id)]).mapped('product_id')
                self.product_id = [(6, 0, selected_products.ids)]

    @api.model
    def create(self, vals):
        print("Create Function ")
        print("SELECT id FROM custom_branch_line WHERE (branch_id = %s) AND (product_id = %s)" % (
            vals.get('branch_to_id'), vals['product_id']))
        result = super(CustomTransRequest, self).create(vals)
        return result

person Ahmed Abd El Latif    schedule 04.12.2019    source источник
comment
Вы пробовали просто использовать связанное поле для product_id. И помните о правилах именования odoo: поле должно называться product_ids, потому что может быть более одного custom.product. Вот почему в руководстве рекомендуется использовать _id для Many2one и _ids для Many2many и One2manyполей.   -  person CZoellner    schedule 04.12.2019
comment
Спасибо за предложение, но что вы подразумеваете под связанным полем? не могли бы вы уточнить, пожалуйста?   -  person Ahmed Abd El Latif    schedule 04.12.2019
comment
Вы можете прочитать о связанных полях здесь. Может быть, это будет более легкое решение для вас.   -  person CZoellner    schedule 05.12.2019


Ответы (1)


Вот как Odoo обрабатывает поля X2many, по соглашению они называются командами (или списком команд) большую часть времени в методе create, команда, которая будет передана для ваших полей m2m, будет:

 # only one command 6 which tell Odoo replace all record with the selected ids
 [(6, 0, [list_of_selected_record_ids)]

Итак, чтобы получить их, просто выполните: vals['product_id'][0][2]

Нет, я не знаю, пытаетесь ли вы просто показать запрос выбора или хотите его использовать, если вы просто его распечатываете:

  # replace vals['product_id'] with 
  '({})'.format(','.join(vals['product_id'][0][2]))

Если вы его выполните, используйте параметры запроса:

self.cr.execute("SELECT id FROM custom_branch_line WHERE (branch_id = %s) AND (product_id = %s)", (vals['branch_to_id'], vals['product_id'][0][2]))

для получения дополнительной информации о команде X2many проверьте это:

One2many и Many2many используют специальные «команды» < / а>

Примечание: я предполагал, что это поле не будет пустым, если вам не нужно сначала проверить, не являются ли поля пустыми.

person Charif DZ    schedule 04.12.2019