Является ли оператор Python 3 continue l oop проблемой в методах вычислений в Odoo 13? - PullRequest
2 голосов
/ 18 февраля 2020

Я переносу модуль в версию 13.0, которая использует continue в al oop внутри вычислительного метода, и ошибка на некоторое время сводила меня с ума.

Я упростил код до минимум, пока у меня не возникло такого рода глупости:

@api.depends('move_lines', 'move_lines.price_subtotal')
def _compute_subtotal(self):
    for picking in self:
        if picking.picking_type_id.code not in ['incoming', 'outgoing']:
            continue
        picking.update({
            'amount_untaxed': 3.0,
        })

Но я все еще получал ошибку, которая, кстати, была (и была показана только при создании новых комплектаций):

stock.picking(<NewId 0x7f5404ba5eb8>,).amount_untaxed

Итак, я понял, что проблема была в выражении continue, если я его убрал, это сработало. И я пытался использовать continue в нескольких циклах других вычислительных методов стандартных модулей Odoo, с тем же результатом.

До сих пор, если вы не присвоили значение для поля в вычисляемом методе, оно автоматически потребовалось False, поэтому continue не было проблемой.

Кто-нибудь сталкивался с такой же проблемой и с continue?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020

Требуется установить значение для каждого набора записей. Если мы продолжим и не установим значение для указанного набора записей c, возникнет проблема, как вы упомянули.

Попробуйте ввести следующий код:

@api.depends('move_lines', 'move_lines.price_subtotal')
def _compute_subtotal(self):
    for picking in self:
        amount_untaxed = 0.0
        if picking.picking_type_id.code == 'internal':
            amount_untaxed = 3.0
        picking.update({
            'amount_untaxed': amount_untaxed,
        })

Продолжить будет работать, если мы сделать код что-то вроде:

@api.depends('move_lines', 'move_lines.price_subtotal')
def _compute_subtotal(self):
    for picking in self:
        picking.update({
            'amount_untaxed': 0.0,
        })
        if picking.picking_type_id.code not in ['incoming', 'outgoing']:
            continue
        picking.update({
            'amount_untaxed': 3.0,
        })
2 голосов
/ 18 февраля 2020

Проблема не в самом операторе continue, а в том, что Odoo ожидает от вас установки значения для вашего вычисляемого поля, потому что если вы проверите код __get__ из Field class:

def __get__(self):
     ....
     .....
        elif self.compute:
            ........
            ........
            else:
                recs = record if self.recursive or not record.id else record._in_cache_without(self)
                try:
                    # Here it's computing the value for this record
                    self.compute_value(recs)
                except AccessError:
                    self.compute_value(record)
                # after computation they try the get the value from the environment cache
                value = env.cache.get(record, self)

И поскольку вы не установили значение для этой записи, это вызовет эту ошибку odoo.exceptions.CacheMiss: ('stock.picking(ID_OF_RECORD,).amount_untaxed', None). Вам необходимо установить значение для каждого вычислительного поля, которое вычисляется в этом методе.

...