【问题标题】:Search domain : multiple condition in odoo搜索域:odoo 中的多个条件
【发布时间】:2020-01-06 12:21:57
【问题描述】:

如何转换这个表达式:((A & B) | (C & D)) | OpenERP 域语法中的 ((E & F) | (G & H))

PostgreSQL 查询是:

SELECT
  *
FROM
   calendar_event
WHERE
  (
    (start_datetime <= '2020-01-07 09:00:00' and '2020-01-07 09:00:00' <= stop_datetime) or
    (start_datetime <= '2020-01-07 11:00:00' and '2020-01-07 11:00:00' <= stop_datetime)
  ) or (
    ('2020-01-07 09:00:00' <= start_datetime and start_datetime <= '2020-01-07 11:00:00') or
    ('2020-01-07 09:00:00' <= stop_datetime and stop_datetime <= '2020-01-07 11:00:00')
  )

我试着做这样但不正确,请问我哪里错了?

   inParams1.push([
         "|",
         "&",
         ["start_datetime", "<",  '2020-01-07 09:00:00'],
         ['2020-01-07 09:00:00', "<=", "stop_datetime"],
         "&",
         ["start_datetime", "<=", '2020-01-07 11:00:00'],
         ['2020-01-07 11:00:00', "<=", "stop_datetime"],

         "|",
         "&",
         ['2020-01-07 09:00:00', "<=", " start_datetime"],
         ["start_datetime", "<=",'2020-01-07 11:00:00'],
         "&",
         ['2020-01-07 09:00:00', "<=",  "stop_datetime"],
     ["stop_datetime", "<=",'2020-01-07 11:00:00']
]);

我需要你的帮助,我工作了很多天,但我找不到解决方案:(

【问题讨论】:

    标签: javascript odoo odoo-12


    【解决方案1】:

    我发现这个答案对复杂的领域很有帮助。 https://stackoverflow.com/a/57853916/8211573

    根据那个答案,你可以使用odoo.osv.expression

    In [6]: from odoo.osv.expression import AND,OR                                                                                                                                     
    
    In [7]: a,b,c,d,e,f,g,h = ([("field_" + x, "=", "value_" + x)] for x in "ABCDEFGH")                                                                                                
    
    In [8]: OR([OR([AND([a,b]),AND([c,d])]),OR([AND([e,f]),AND([g,h])])])                                                                                                              
    Out[8]: 
    ['|',
     '|',
     '&',
     ('field_A', '=', 'value_A'),
     ('field_B', '=', 'value_B'),
     '&',
     ('field_C', '=', 'value_C'),
     ('field_D', '=', 'value_D'),
     '|',
     '&',
     ('field_E', '=', 'value_E'),
     ('field_F', '=', 'value_F'),
     '&',
     ('field_G', '=', 'value_G'),
     ('field_H', '=', 'value_H')]
    

    【讨论】:

      【解决方案2】:

      你用括号使过滤器复杂化了:

      (
          (start_datetime <= '2020-01-07 09:00:00' and '2020-01-07 09:00:00' <= stop_datetime) or
          (start_datetime <= '2020-01-07 11:00:00' and '2020-01-07 11:00:00' <= stop_datetime)
        ) or (
          ('2020-01-07 09:00:00' <= start_datetime and start_datetime <= '2020-01-07 11:00:00') or
          ('2020-01-07 09:00:00' <= stop_datetime and stop_datetime <= '2020-01-07 11:00:00')
        )
      

      和这个是一样的:

          (start_datetime <= '2020-01-07 09:00:00' and '2020-01-07 09:00:00' <= stop_datetime)
           or
          (start_datetime <= '2020-01-07 11:00:00' and '2020-01-07 11:00:00' <= stop_datetime)
          or 
          ('2020-01-07 09:00:00' <= start_datetime and start_datetime <= '2020-01-07 11:00:00') 
          or
          ('2020-01-07 09:00:00' <= stop_datetime and stop_datetime <= '2020-01-07 11:00:00')
      

      所以试试这个:

          [    '|'
               "&",
               ["start_datetime", "<",  '2020-01-07 09:00:00'],
               ["stop_datetime", ">=", '2020-01-07 09:00:00'],
               '|',
               "&",
               ["start_datetime", "<=", '2020-01-07 11:00:00'],
               ["stop_datetime", ">=", '2020-01-07 11:00:00'],
               '|',
               "&",
               ["start_datetime", ">=", '2020-01-07 09:00:00'],
               ["start_datetime", "<=",'2020-01-07 11:00:00'],
               "&",
               ["stop_datetime", ">=",  '2020-01-07 09:00:00'],
               ["stop_datetime", "<=",'2020-01-07 11:00:00']
           ] 
      

      如果它不适合你,请告诉我。

      【讨论】:

      • 等一下['2020-01-07 09:00:00', "&lt;=", "stop_datetime"],这是一个错字吗?或者您正在执行此操作,因为该字段的名称应位于首位:["stop_datetime" , "&gt;=", "2020-01-07 09:00:00"]
      • 检查我在odoo字段中的编辑名称应该在第一个位置('field_name', 'operator', value)
      • 我不在我的电脑上测试这个,检查我的最终编辑我希望它对你有用
      • 亲爱的 Charif,使用的名字应该在第一位('field_name', 'operator', value),看起来效果不错,谢谢
      • 如果对你有帮助,请考虑接受我的回答,谢谢
      猜你喜欢
      • 1970-01-01
      • 2022-08-02
      • 2018-01-12
      • 2023-03-10
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 2018-11-18
      • 2013-09-13
      相关资源
      最近更新 更多