Odoo 8: проблема с fnct_inv в fields.function () не запущена - PullRequest
0 голосов
/ 26 февраля 2020

Я создал функцию поля с этим объявлением:

'purchase_id': fields.function(_get_purchase_id, fnct_inv=_set_purchase_id, method=True, type="many2one", relation="purchase.order", string="Bon de commande"),

Проблема в том, что fnct_inv не запущен, а поле purchase_id остается пустым. Вот определение метода _set_purchase_id:

def _set_purchase_id(self, cr, uid, ids, field_name, field_value, arg, context):
    query = """
    SELECT picking_id, po.id FROM stock_picking p, stock_move m, purchase_order_line pol, purchase_order po
        WHERE p.id in %s and p.id = m.picking_id and m.purchase_line_id = pol.id and pol.order_id = po.id
        GROUP BY picking_id, po.id

    """
    cr.execute(query, (tuple(ids), ))
    picks = cr.fetchall()
    _logger.info("============================================ %s " % ids)
    for pick_id, po_id in picks:
        self.write(cr, uid, [pick_id], {'purchase_id': [(4, po_id)]}, context=context)

Я кому-то могу помочь? Или есть другое решение? Спасибо

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Цель «обратных» методов в Odoo состоит не в том, чтобы установить поле, для которого оно определено, а в том, чтобы установить все необходимые поля для вычисления этого поля, чтобы вычисление вычисляло значение, которое пользователь дал Odoo для это вычисляемое поле.

Позвольте мне привести вам пример, потому что я не хочу работать над готовым решением вашей проблемы.

Если у вас есть вычисляемое поле days_since_last_action на Для модели, которая вычисляется с помощью поля даты (date_last_action) на той же модели, обратный метод не установит days_since_last_action. Вместо этого вам нужно взять новое значение days_since_last_action и обратить его к новой дате.

Это означает, что для

вычислительный метод равен days_since_last_action = today - date_last_action

обратный метод равен date_last_action = today - new value of days_since_last_action

0 голосов
/ 26 февраля 2020

В odoo8 мы используем Computed полей.

purchase_id = fields.Many2one('purchase.order','Bon de commande',compute='_set_purchase_id')

def _set_purchase_id(self, cr, uid, ids, field_name, field_value, arg, context):
    query = """
    SELECT picking_id, po.id FROM stock_picking p, stock_move m, purchase_order_line pol, purchase_order po
        WHERE p.id in %s and p.id = m.picking_id and m.purchase_line_id = pol.id and pol.order_id = po.id
        GROUP BY picking_id, po.id

    """
    cr.execute(query, (tuple(ids), ))
    picks = cr.fetchall()
    _logger.info("============================================ %s " % ids)
    for pick_id, po_id in picks:
        self.write(cr, uid, [pick_id], {'purchase_id': [(4, po_id)]}, context=context)

Более подробно вы можете обратиться: https://www.odoo.com/documentation/8.0/howtos/backend.html#computed -поли-и-по-умолчанию, значение

...