2016-09-21 2 views
0

ENVIRONMENT計算フィールドがOdoo8のTransientModelからアクセスできないのはなぜですか?

私はそれらの間One2manyの関係で(ロット管理者がいくつかの利用可能な多くを持つことになります)、(lots.managerproduct.lot.available命名)2 TransientModelを作成しました。

私の目的は、利用可能なロットのリストを表示することです。ユーザーは、使用するロットと、それぞれのロットの量を選択することができます。したがって、product.lot.availableには、selected(ロットが使用されているかどうかを示すBoolean)とqty(各ロットから使用された量を示すFloat)のフィールドlot_id(ロットを選択する)があります。他の側では

lots.managerモデルでは、私がselectedフィールドで利用可能なすべてのロットのqtyの合計を計算total_qty_selectedという名前の計算結果フィールドを、持っています。

CODE

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) 

PROBLEM、計算フィールドtotal_qty_selectedは私がproduct.lot.availableからそれを読んしようとすると、(私はビューでそれを示し、素晴らしい作品)が、うまく計算され

私は常に0を得ます。例えば、上記のonchange関数の_logger行は、私に製品の名前を表示しますが、total_qty_selectedはその瞬間ではなく0を返します。フォーム内の2.00を読み取るか、0と異なる値を入力してください。

私はonchange関数でいくつかのことを行うには適切な値を取得する必要があります。

これを管理する方法を教えてもらえますか?

答えて

0

計算されたフィールドにstore=Trueを使用してください。次のコードを試してください

+0

が、同じ結果:

これらの変更の後、私は、この新しいフィールドを介してproduct.lot.availableモデルから必要な値を得ることができます。私は '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, 
) 

そして、このフィールドは、元の1が行うたびに変化し、このコードを追加:

明らか
@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ビュー、私はそれを不可視にしました。 `ストア= true`を持つ私は念のために、試してみました

@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) 
関連する問題