跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 新手求助
  4. 新手求助,一个表A想关联表B显示表B的一个字段该如何处理?

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

已定时 已固定 已锁定 已移动 已解决 Odoo 新手求助
11 帖子 3 发布者 4.7k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • W 离线
    W 离线
    winbo
    写于 最后由 编辑
    #1

    新手求助,一个表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 离线
      W 离线
      winbo
      写于 最后由 编辑
      #2

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

      1 条回复 最后回复
      0
      • digitalsatoriD 离线
        digitalsatoriD 离线
        digitalsatori 管理员
        写于 最后由 编辑
        #3

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

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

        1 条回复 最后回复
        0
        • W 离线
          W 离线
          winbo
          写于 最后由 编辑
          #4

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

          digitalsatoriD 1 条回复 最后回复
          0
          • digitalsatoriD 离线
            digitalsatoriD 离线
            digitalsatori 管理员
            写于 最后由 编辑
            #5

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

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

            1 条回复 最后回复
            0
            • B 离线
              B 离线
              battle
              写于 最后由 编辑
              #6

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

              1 条回复 最后回复
              0
              • W 离线
                W 离线
                winbo
                写于 最后由 编辑
                #7

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

                1 条回复 最后回复
                0
                • W 离线
                  W 离线
                  winbo
                  写于 最后由 编辑
                  #8

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

                  1 条回复 最后回复
                  0
                  • digitalsatoriD 离线
                    digitalsatoriD 离线
                    digitalsatori 管理员
                    在 回复了 winbo 最后由 编辑
                    #9

                    @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 离线
                      W 离线
                      winbo
                      写于 最后由 编辑
                      #10

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

                      1 条回复 最后回复
                      0
                      • digitalsatoriD 离线
                        digitalsatoriD 离线
                        digitalsatori 管理员
                        写于 最后由 编辑
                        #11

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

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

                        1 条回复 最后回复
                        0

                        • 登录

                        • 没有帐号? 注册

                        • 登录或注册以进行搜索。
                        • 第一个帖子
                          最后一个帖子
                        0
                        • 版块
                        • 标签
                        • 热门
                        • 用户
                        • 群组