Odoo 中文社区

    • 注册
    • 登录
    • 搜索
    • 版块
    • 标签
    • 热门
    • 用户
    • 群组

    Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

    由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

    本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

    开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

    如果您登录系统碰到问题,请在微信公众号留言:

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

    Odoo 新手求助
    3
    11
    4205
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • W
      winbo 最后由 编辑

      新手求助,一个表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






      1 条回复 最后回复 回复 引用 0
      • W
        winbo 最后由 编辑

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

        1 条回复 最后回复 回复 引用 0
        • digitalsatori
          digitalsatori 管理员 最后由 编辑

          看这段:https://www.odoo.com/documentation/10.0/howtos/backend.html#relations-between-models

          【上海先安科技】(tony AT openerp.cn)

          1 条回复 最后回复 回复 引用 0
          • W
            winbo 最后由 编辑

            @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字段了

            digitalsatori 1 条回复 最后回复 回复 引用 0
            • digitalsatori
              digitalsatori 管理员 最后由 编辑

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

              【上海先安科技】(tony AT openerp.cn)

              1 条回复 最后回复 回复 引用 0
              • B
                battle 最后由 编辑

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

                1 条回复 最后回复 回复 引用 0
                • W
                  winbo 最后由 编辑

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

                  1 条回复 最后回复 回复 引用 0
                  • W
                    winbo 最后由 编辑

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

                    1 条回复 最后回复 回复 引用 0
                    • digitalsatori
                      digitalsatori 管理员 @winbo 最后由 编辑

                      @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上的几条记录,你的函数字段只取找到的第一条?

                      【上海先安科技】(tony AT openerp.cn)

                      1 条回复 最后回复 回复 引用 0
                      • W
                        winbo 最后由 编辑

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

                        1 条回复 最后回复 回复 引用 0
                        • digitalsatori
                          digitalsatori 管理员 最后由 编辑

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

                          【上海先安科技】(tony AT openerp.cn)

                          1 条回复 最后回复 回复 引用 0
                          • First post
                            Last post