获取所有父'对象'?

-1 投票
1 回答
1538 浏览
提问于 2025-04-18 00:38

我需要从子对象获取所有的父对象。我不知道会有多少个父对象,所以我觉得这里可能需要用到递归。

我有一个对象,它可能有也可能没有其他继承的对象。如果它有继承的对象,我需要把那个对象的ID加到一个列表里,然后检查这个继承对象(或者多个对象)是否有父对象。如果有的话,就把那些父对象的ID也加到同一个列表里,然后继续检查它们的父对象,依此类推。这个过程应该在最深层的对象没有父对象时停止。

所以我现在的代码是这样的:

def get_parent_groups(self, cr, uid, ids, grp_id, context=None):
    res = [] # list for parent ids
    grp_obj = self.pool.get('res.groups')
    #grp_id is childs `id` it means same thing as 
    # `parent_grp.id`, only that latter is parent object id.
    grp = grp_obj.browse(cr, uid, grp_id) 
    if grp.implied_ids: #check if child has any parent ids
        for parent_grp in grp.implied_ids:
            res.append(parent_grp.id) #append found parent ids
    return res

这段代码只获取了第一个父对象的ID。所以我想在这里加入递归,获取所有其他的父对象,但我不知道该怎么正确地实现。有没有人能帮帮我?

附注: 我看到有人问像 cr, uid 这样的东西是什么意思,我没有具体说明,因为我觉得这和问题无关(其实确实无关),但为了让大家明白,这些输入是在OpenERp框架方法中需要的:

`cr` - database cursor 
`uid` - current user id
`ids` - ids of the object

不过正如我所说,这些和问题没有关系,我只是贴出了一个有效的方法,以免遗漏任何东西。

1 个回答

0

我通过重新写这个方法解决了这个问题。不知道这种方式是不是最好的,但确实有效:

def get_parent_groups(self, cr, uid, ids, grp_id, context=None):
    res = []     
    grp_obj = self.pool.get('res.groups')
    grp = grp_obj.browse(cr, uid, grp_id)
    if grp.implied_ids:
        for parent_grp in grp.implied_ids:
            res.append(parent_grp.id)            
            if parent_grp.implied_ids:
                parent_ids = self.get_parent_groups(cr, uid, ids, parent_grp.id)
                for parent_id in parent_ids:
                    res.append(parent_id)
    return res

撰写回答