2016-09-21 2 views
0

СРЕДЫПочему вычисленное поле не доступно из TransientModel в Odoo8?

Я создал два TransientModel (названный lots.manager и product.lot.available), с One2many отношений между ними (менеджер много будет доступно несколько лотов).

Моя цель - показать список доступных лотов, и пользователь сможет выбрать, какие лоты он хочет использовать, и сколько количества от каждого. Таким образом, у product.lot.available есть поля lot_id (выбрать лот), selected (a Boolean, который указывает, если участок используется или нет) и qty (a Float, что указывает количество, используемое для каждой партии).

С другой стороны, в lots.manager модели, у меня есть вычисляемое поле с именем total_qty_selected, который вычисляет сумму qty всех доступных лотов, чьи selected поле Правда.

КОД

class LotsManager(models.TransientModel): 
    _name = 'lots.manager' 

    @api.multi 
    @api.depends('product_lots_available', 'product_lots_available.selected', 
       'product_lots_available.qty') 
    def _compute_total_qty_selected(self): 
     for manager in self: 
      total = 0 
      for lot in manager.product_lots_available: 
       if lot.selected is True: 
        total += lot.qty 
      manager.total_qty_selected = total 

    move_id = fields.Many2one(
     comodel_name='stock.move', 
     string='Stock move', 
     required=True, 
     select=True, 
     readonly=True, 
    ) 
    product_id = fields.Many2one(
     comodel_name='product.product', 
     related='move_id.product_id', 
     string='Product', 
    ) 
    product_lots_available = fields.One2many(
     comodel_name='product.lot.available', 
     inverse_name='manager_id', 
     string='Available lots', 
    ) 
    total_qty_selected = fields.Float(
     compute='_compute_total_qty_selected', 
     string='Total quantity selected', 
    ) 


class ProductLotAvailable(models.TransientModel): 
    _name = 'product.lot.available' 

    manager_id = fields.Many2one(
     comodel_name='lots.manager', 
     string='Lots Manager', 
    ) 
    lot_id = fields.Many2one(
     comodel_name='stock.production.lot', 
     string='Lot', 
     readonly=True, 
    ) 
    selected = fields.Boolean(
     string='Selected', 
     default=False, 
    ) 
    qty = fields.Float(
     string='Quantity', 
     default=0.00, 
    ) 

    @api.onchange('selected') 
    def onchange_selected(self): 
     if self.selected is True: 
      _logger.info(self.manager_id.product_id.name) 
      _logger.info(self.manager_id.total_qty_selected) 

ПРОБЛЕМА

Вычисленное поле total_qty_selected рассчитывается хорошо (я показываю его в представлениях и прекрасно работает), но, когда я пытаюсь читать из product.lot.available Я всегда получаю 0. Например, строки _logger в функции onchange выше, покажите мне имя продукта правильно, но total_qty_selected возвращает 0, а не в тот момент I c прочитайте 2.00 в форме или любое другое значение, отличное от 0.

Мне нужно получить правильное значение для выполнения некоторых функций в функции onchange.

Может ли кто-нибудь помочь мне, как с этим справиться?

ответ

0

Используйте store=True в своем поле. Попробуйте ввести код

class LotsManager(models.TransientModel): 
_name = 'lots.manager' 

    total_qty_selected = fields.Float(
    compute='_compute_total_qty_selected', 
    string='Total quantity selected', store=True 
) 
+0

Я пытался, на всякий случай, но тот же результат с 'магазин = true'. Я полагаю, что установка 'store = True' поля' TransientModel' не имеет большого смысла, потому что записи таких моделей не будут сохранены. – forvas

+0

Затем попробуйте класс class_name (models.Model) – KbiR

+0

Это должен быть «TransientModel», потому что это определенная форма для выбора некоторых значений и применения некоторых действий, но не для хранения новых записей. – forvas

0

Наконец-то мне удалось решить эту проблему с помощью ужасного обходного пути. Но он работает хорошо.

Я добавил следующее поле для lots.manager модели:

total_qty_selected_copy = fields.Float(
    string='Total quantity selected (copy)', 
    default=False, 
) 

И это поле меняется каждый раз, когда оригинал один делает, добавив следующий код:

@api.one 
@api.onchange('total_qty_selected') 
def onchange_selected(self): 
    self.total_qty_selected_copy = self.total_qty_selected 

Очевидно, я должен был добавить total_qty_selected_copy к представление XML, и я сделал его невидимым.

После этих изменений, я могу получить значение мне нужно от product.lot.available модели через это новое поле:

@api.onchange('selected') 
def onchange_selected(self): 
    if self.selected is True: 
     _logger.info(self.manager_id.product_id.name) 
     _logger.info(self.manager_id.total_qty_selected_copy) 
Смежные вопросы