跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 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. 关于many2one的domain问题

关于many2one的domain问题

已定时 已固定 已锁定 已移动 已解决 Odoo 开发与实施交流
6 帖子 3 发布者 1.1k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 阿 离线
    阿 离线
    阿巴阿巴
    写于 最后由 编辑
    #1

    有两个many2one字段,类似于省市的两级联动,如下:

    province_id = fields.Many2one('模型1', string='省')
    city_id = fields.Many2one('模型2', string='市')
    

    目前的需求是根据省province_id的值,动态筛选市city_id显示的值。
    根据网上的说法,我用了以下onchange函数

    @api.onchange('province_id')
    def _onchange_city(self):
        # 取对应的省的值
        province_value = self.province_id .province 
        # 将取到的值跟模型2中市对应的省值进行比较匹配
        area_id_list = []
        for record in self.env['模型2'].search([('city_id.省的值', '=', province_value)]).ids:
            area_id_list.append(record)
        # 用列表中的id去筛选,符合的留下
        domain = {'city_id ': [('id', 'in', area_id_list)]}
        return {'domain': domain}
    

    最后得出来的效果跟odoo13中公司的国家和省的字段选择是一样的,如图:
    238773ec-c737-4652-9744-87357383b415-image.png
    但是出现了一个问题:在第一次编辑时选择了国家--“中国”,然后退出此记录再进去编辑时,省的选择会变成全部而不是在属于中国的省里进行筛选,如图:
    32d69bdc-9912-4224-a3a1-11858f951a80-image.png
    想要询问的是,有没有办法在第二次进入以后,省的选择能通过国家的字段值进行筛选后显示,或者有类似的解决办法。
    非常感谢大家!

    L 1 条回复 最后回复
    0
    • digitalsatoriD 离线
      digitalsatoriD 离线
      digitalsatori 管理员
      在 回复了 阿巴阿巴 最后由 编辑
      #4

      @阿巴阿巴 用onchange方法返回domain的办法来过滤另一个Many2X的列表的确有楼主所描述的问题。

      其实你所描述的问题,只要模型2上有指向模型1的Many2one字段(比如:province_id,就可以直接在city_id字段上添加domain来获得需要的效果:

       city_id = fields.Many2one("模型2", string='市',  domain="[('province_id', '=?', province_id)]")
      

      注意:domain中带引号的'province_id'表示你模型2上的字段,而后面的没有引号的字段province_id表示当前对象上的字段。

      另外,要了解一下,onchange方法会逐渐被compute方法所取代。

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

      阿 1 条回复 最后回复
      0
      • L 离线
        L 离线
        leuan
        在 回复了 阿巴阿巴 最后由 编辑
        #2

        @阿巴阿巴 一个 onchange 就可以解决了

        阿 1 条回复 最后回复
        0
        • 阿 离线
          阿 离线
          阿巴阿巴
          在 回复了 leuan 最后由 编辑
          #3

          @leuan 你好,我使用的是onchange,但是onchange需要在字段国家改变值后才能响应函数,我在第二次进入记录进行编辑时,并没有改变国家的值,而是在第一次编辑后的国家的值下,进行选择省的值,这个时候会出现所有的省和地区,并没有进行筛选。

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

            @阿巴阿巴 用onchange方法返回domain的办法来过滤另一个Many2X的列表的确有楼主所描述的问题。

            其实你所描述的问题,只要模型2上有指向模型1的Many2one字段(比如:province_id,就可以直接在city_id字段上添加domain来获得需要的效果:

             city_id = fields.Many2one("模型2", string='市',  domain="[('province_id', '=?', province_id)]")
            

            注意:domain中带引号的'province_id'表示你模型2上的字段,而后面的没有引号的字段province_id表示当前对象上的字段。

            另外,要了解一下,onchange方法会逐渐被compute方法所取代。

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

            阿 1 条回复 最后回复
            0
            • 阿 离线
              阿 离线
              阿巴阿巴
              在 回复了 digitalsatori 最后由 编辑
              #5

              @digitalsatori 谢谢您的回答,解决了困惑我几周的问题。
              另外想询问您关于“onchange方法会逐渐被compute方法所取代”的疑问:在我学习到的知识里,compute与@api.depends()是联动的,在监听到值改变后,用于实时计算值,是否我忽略了其它东西?

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

                @阿巴阿巴 在 关于many2one的domain问题 中说:

                我学习到的知识里,compute与@api.depends()是联动的,在监听到值改变后,用于实时计算值,是否我忽略了其它东西?

                对啊,所以说compute字段通过depends可以取代onchange方法啊。至于onchange返回warning,domain这些也可以用其他方法来替代。

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

                1 条回复 最后回复
                0
                • digitalsatoriD digitalsatori 将这个主题标记为已解决,在

                • 登录

                • 没有帐号? 注册

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