新手求助,一个表A想关联表B显示表B的一个字段该如何处理?



  • 新手求助,一个表A想关联表B显示表B的一个字段该如何处理?
    A 有字段id ,name 等等
    B 有id,name,type,res_id
    关联关系:B.type=A表名 and res_id=A.id
    如:A
    1 zhangsan
    2 lisi
    3 wangwu
    B
    1 aaaa A 1
    2 bbbb A 2
    3 cccc A 3
    4 dddd X 1
    5 fffff X 2

    我想在一个tree试图显示A表所有字段,并且显示B表的name字段该如何处理?
    现在我的 tree试图如下:

    mystock_cancel_tree_view
    procurement.order








  • 大神能帮下忙吗?@digitalsatori @administrators


  • 管理员



  • @digitalsatori 大神 感谢回复。
    现已解决。解决办法分享一下:在A表字段声明的地方,加一个函数字段比如‘myfunfields’:
    fields.function(_get_B_name, type='char', string='获取B表name', store=False),
    然后定义一个函数
    def _get_B_name(self, cr, uid, ids, field_name, arg, context=None):
    res = {}
    moves = self.browse(cr, uid, ids, context)

        for move in moves:
        
            cr.execute('''select name from B where
            res_id = % s and type = % s''' %(move.id, "\'A\'"))
            result = cr.fetchone()
            if result:
                res[move.id] = result[0]
    
            else:
                res[move.id] = False
    
        return res
    

    这样在view就看到想要的B表里面的name字段了


  • 管理员

    为什么要用function字段?Many2one字段不就是做这个事的吗?



  • 你这是直接操作数据库了,用表关联关系,然后related或者onchange获取关联表字段值不就行了



  • @battle @digitalsatori 关键是这两个表并没有很明确的关联关系。其实B表是一个message表 他的type字段包含了几乎所有其他表的信息。B.type=A 再通过res_id找到A表的id这样才能拿到需要的记录



  • 请问还有其他更简单的方法吗?刚开始接触 不是很明白


  • 管理员

    @winbo新手求助,一个表A想关联表B显示表B的一个字段该如何处理? 中说:

    @digitalsatori 大神 感谢回复。
    现已解决。解决办法分享一下:在A表字段声明的地方,加一个函数字段比如‘myfunfields’:
    fields.function(_get_B_name, type='char', string='获取B表name', store=False),
    然后定义一个函数
    def _get_B_name(self, cr, uid, ids, field_name, arg, context=None):
    res = {}
    moves = self.browse(cr, uid, ids, context)

        for move in moves:
        
            cr.execute('''select name from B where
            res_id = % s and type = % s''' %(move.id, "\'A\'"))
            result = cr.fetchone()
            if result:
                res[move.id] = result[0]
    
            else:
                res[move.id] = False
    
        return res
    

    这样在view就看到想要的B表里面的name字段了

    没仔细看你的要求,抱歉。A和B没有直接关联,B上有一个reference字段可以选择与A的某个记录关联,也可以不。你的方法挺好的,没有问题。事实上一条A记录可以对应B上的几条记录,你的函数字段只取找到的第一条?



  • 是的,其实满足条件的只有一条记录,所以没有问题,现在还有个问题想请教一下。我有一个A表 有一个one2many的字段关联B表(A主表,B明细表)我现在要在一个表单页面显示主表A的一些数据,和B表关联到A表的所有记录该怎么处理?假设B表有个res_A_id,所有res_A_id等于当前A表id的记录都显示出来。


  • 管理员

    一个最典型的例子就是销售管理中,订单(sale.order)和订单明细(sale.order.line)的关系,你可以参考一下“销售”模块


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待