Добавить все идентификаторы stock.move в список из всей цепочки связанных записей - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть записи в таблице stock.move, которые имеют отношение One2many к stock.move.reconcile со столбцом move_to_id, который является идентификатором другой записи в таблице stock.move. Таким образом, в этой цепочке могут быть тысячи записей.

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

Я знаю, что, вероятно, мне нужно использовать цикл while, что-то вроде while there is move_to_ids, тогда я должен перебирать записи и продолжать добавлять идентификаторы в список, но я просто могу 't понять, как это сделать.

  • move1(stock.move ID = 10) запись, которая имеет отношение One2many с двумя записями внутри: move_to_ids (stock.move.reconcile)

  • каждый из move_to_ids имеет move_to_id(many2one, 'stock.move' ID = 11)

  • каждая из этих move_to_id(stock.move, ID=11) записей снова имеет любое число move_to_ids ( stock.move.reconcile ) and each of thismove_to_ids records have move_to_id ('stock.move', ID = 12) `и т. д.

Поэтому в основном я хочу добавить в список все move_to_id ID 10, 11,12 и т. Д. Для перечисления всех связанных move_to_ids.

moves_to_recalculate = [10,11,12] и т. Д. До тех пор, пока не будет 0 move_to_ids для получения move_to_id от.

class StockMove(models.Model):
_name = 'stock.move'

move_to_ids = fields.One2many(
    'stock.move.reconcile', 'move_from_id', string='Move to')

 move_from_ids = fields.One2many(
    'stock.move.reconcile', 'move_to_id', string='Move From'
)
class StockMoveReconcile(models.Model):
    _name = 'stock.move.reconcile'
    _description = 'Stock Move Reconcile'

    move_to_id = fields.Many2one('stock.move', string='Move To')
    move_from_id = fields.Many2one('stock.move', string='Move From')

def recalculate(self):
    moves = self.browse(('active_ids'))
    moves_to_recalculate = []
    for move1 in moves:
        #I add my first move in chain to list
        moves_to_recalculate.append(move1.id)
        #First move have 2 moves_to_ids so i make another loop to add it ID to list
        for second_tier_move in move.move_to_ids:
            moves_to_recalculate.appen(second_tier_move.move_to_id.id)
            # secont tier move has 1 move_to_ids so i do another loop, and add it's ID to list.
            for third_tier_move in second_tier_move.move_to_ids:
                moves_to_recalculate.appen(third_tier_move.move_to_id.id)
                #third_tier_move has another move_to_ids , and so on.

1 Ответ

0 голосов
/ 08 ноября 2019

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

def recalculate_fifo(self):

    moves = self.browse(self._context.get('active_ids'))
    moves_to_recalculate = moves
    current_moves = moves
    while current_moves:
        current_moves = current_moves.mapped('move_to_ids.move_to_id')
        current_moves -= moves_to_recalculate
        moves_to_recalculate |= current_moves
...