跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 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. 关于domain,如何跨类比较?

关于domain,如何跨类比较?

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

    onchange 回掉里动态改domain

    B 1 条回复 最后回复
    0
    • Felix_ChengF 离线
      Felix_ChengF 离线
      Felix_Cheng
      在 回复了 BraidTim 最后由 Felix_Cheng 编辑
      #3

      @BraidTim
      以下方式也行:
      <field name="B2" domain="[('B1', 'operator', parent.A1)]"/>

      搜索域中的每个元组需要有3个元素,格式为:('field_name','operator',value),其中:
      (1) field_name必须是对象模型的字段的有效名称,可使用点符号进行many2one关系,例如“partner_id.country”是有效值。
      (2) 运算符必须是一个带有有效比较运算符的字符串:=,!=,>,> =,<,<=,like,ilike,in,not in,child_of
      (3) 值必须是与field_name的值进行比较的有效值,具体取决于其类型

      Felix / TriangleERP inc. / QC / CA

      B 1 条回复 最后回复
      0
      • B 离线
        B 离线
        BraidTim
        在 回复了 Felix_Cheng 最后由 编辑
        #4

        @Felix_Cheng
        field name="B2" domain="[('B1', 'operator', parent.A1)]"
        似乎在many2one里面使用domain,字段名字直接就是A里面的名字
        我这儿是odoo10,field name="B2" domain="[('A1', 'operator', value)]"这样写就能运行,但是类似上面那样写
        field name="B2" domain="[('B1', '=', 1)]"
        直接就显示
        ValueError: Invalid field u'B1' in leaf "<osv.ExtendedLeaf: (u'B1', u'=', 1) on meeu_v1_warehouse_product_manage (ctx: )>"
        顺便问问value是不需要引号的吗?

        Felix_ChengF 1 条回复 最后回复
        0
        • B 离线
          B 离线
          BraidTim
          在 回复了 Siyuan 最后由 编辑
          #5

          @Siyuan
          能给个简单的例子或者什么模块里有现成的让我学学么?我看教程只有个onchange弹出提示的简单例子,还不知道怎么动态改view的内容。。。谢谢

          S 1 条回复 最后回复
          0
          • Felix_ChengF 离线
            Felix_ChengF 离线
            Felix_Cheng
            在 回复了 BraidTim 最后由 Felix_Cheng 编辑
            #6

            @BraidTim 更正一下上贴,搞反了,不好意思:<field name="B2" domain="[('A1', 'operator', B1)]"/>, value是number类型直接写值不加引号,布尔型False或True,String类型加上引号。具体看数据类型,的确是不太容易的。
            如:
            domain="[('state','=','done')]"
            domain="[('user_id','=',uid)]"
            domain="[('user_id','=',False)]"
            domain="[('reconcile_id','=', False), ('credit', '>',0),('amount_to_pay','>',0)] "
            代码生成如下:
            class Test_b(models.Model):
                _name='test.b'
                _b1=fields.Integer(string='B1')
                _b2=fields.Many2one('test.a', string='B2')

            class Test_a(models.Model):]
                _name='test.a'
                _a1=fields.Integer(string='A1')

            XML
            <record id='test_b_form' model='ir.ui.view'>
                 xxxxxx....
                 yyyyyy...
                 <form ....>
                    <field name="b1" />
                    <field name="b2" domain="[('a1', '&lt;', b1)]"
                </form>
            其中a1为父表(Many2one)字段,b1为本表字段。在父表筛选记录,该记录的a1字段值比b1的value小
            openerp7.0 在domain写'>'是允许的,但是高版本要写转义'&lt;'

            Felix / TriangleERP inc. / QC / CA

            B 1 条回复 最后回复
            0
            • S 离线
              S 离线
              Siyuan
              在 回复了 BraidTim 最后由 编辑
              #7

              @BraidTim

              例如 account 下面 account_invoice.py

              @api.onchange('product_id')
              def _onchange_product_id(self):
                  domain = {}
              ......
                  return {'domain': domain}
              

              动态修改了product_id 的domain

              1 条回复 最后回复
              0
              • B 离线
                B 离线
                BraidTim
                在 回复了 Felix_Cheng 最后由 编辑
                #8

                @felix_cheng
                谢谢,换过来就对了。本类里面的字段也不用引号是吧?之前我可能加了引号,系统当字符串处理所以还是不行。
                也就是说字段和数字,bool都不用加引号,字符串需要加引号这样?
                对比的时候数据类型会自动转换么?比如如果我想比较date这种,看起来是字符串但是有大小之分的。还是要专门写函数什么的?

                Felix_ChengF 1 条回复 最后回复
                0
                • Felix_ChengF 离线
                  Felix_ChengF 离线
                  Felix_Cheng
                  在 回复了 BraidTim 最后由 Felix_Cheng 编辑
                  #9

                  @braidtim
                  关于date可以写成
                  <field name="domain">[('from_date', '&lt;', '2017-08-01')]
                  是没有问题的,domain将转换成SQL的Where, 换句话说上面的domain在底层数据库翻译为
                  SELECT * FROM table_xxx WHERE from_date < '2017-08-01', (这个可以通过的)

                  也可以从另外角度来看:如,
                  <field name="domain">[('from_date', '&lt;', 'First date to school')],
                  SQL为:
                  SELECT * FROM table_xxx WHERE from_date < 'First date to school', 这明显类型不兼容

                  结论:domain比较类型兼不兼容, 想想看SQL通不通过就可以验证。
                  --(3) 值必须是与field_name的值进行比较的有效值,具体取决于其类型(这个是我在上面贴里提到的)

                  至于其他数字类型的如Integer,Float,Boolean应该可以在一定程度上互相比较,有兴趣的话你可以自己
                  试试。

                  Felix / TriangleERP inc. / QC / CA

                  B 1 条回复 最后回复
                  0
                  • B 离线
                    B 离线
                    BraidTim
                    在 回复了 Felix_Cheng 最后由 编辑
                    #10

                    @felix_cheng
                    先多谢细心指导
                    我在另一个帖子也看到您关于domain的解答,那个帖子问的是直接写在many2one定义里面的domain。我想请问问domain直接在定义字段的时候写和在view中写有什么有略,两种分别有什么适用场景?

                    Felix_ChengF 1 条回复 最后回复
                    0
                    • Felix_ChengF 离线
                      Felix_ChengF 离线
                      Felix_Cheng
                      在 回复了 BraidTim 最后由 Felix_Cheng 编辑
                      #11

                      @braidtim
                      很好的问题 🙂 。
                      在服务器端python里定义《B object A字段》 的domain,她定义于数据库水平层级(最底层)。换句话说,python端的domain有效于所有使用《B object A字段》的view。而在view中定义的domain,只对该view有效。
                      如果你不需要数据库端给该字段预过滤,就可以考虑直接写在view中(这个是我个人看法)

                      有点像required定义于python端和view端的意思, 在python端是表示not null于DB级别,即使代码层create,write也不许该字段为False。而在view端required只是要求在界面该字段中必须填入些内容,对于数据库的约束没有一点影响。

                      Felix / TriangleERP inc. / QC / CA

                      1 条回复 最后回复
                      1

                      • 登录

                      • 没有帐号? 注册

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