Odoo 中文社区

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • Popular
    • Users
    • Groups

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

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

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

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

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

    Solved 关于many2one的domain问题

    Odoo 开发与实施交流
    3
    6
    357
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • 阿
      阿巴阿巴 last edited by

      有两个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 Reply Last reply Reply Quote 0
      • digitalsatori
        digitalsatori 管理员 @阿巴阿巴 last edited by

        @阿巴阿巴 用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 Reply Last reply Reply Quote 0
        • L
          leuan @阿巴阿巴 last edited by

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

          阿 1 Reply Last reply Reply Quote 0
          • 阿
            阿巴阿巴 @leuan last edited by

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

            digitalsatori 1 Reply Last reply Reply Quote 0
            • digitalsatori
              digitalsatori 管理员 @阿巴阿巴 last edited by

              @阿巴阿巴 用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 Reply Last reply Reply Quote 0
              • 阿
                阿巴阿巴 @digitalsatori last edited by

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

                digitalsatori 1 Reply Last reply Reply Quote 0
                • digitalsatori
                  digitalsatori 管理员 @阿巴阿巴 last edited by

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

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

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

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

                  1 Reply Last reply Reply Quote 0
                  • Topic has been marked as solved  digitalsatori digitalsatori 
                  • First post
                    Last post