(23)odoo中的domain表達式


---------
更新日期:
13:57 2017-03-24 星期五
09:10 2016-03-03 星期四
---------
* Domain 表達式
        
    # 用於過濾記錄數,相當於sql的where
       ('field', 'operator',value) 每個條件表達式是元組類型
       第一個是對象的一個column,也就是字段名
       第二個是比較運算符
       第三個就是用來比較的值
     domain=[('user_id', '=', uid)] 當前用戶做為條件過濾
    #比較運算符如下:
      <,>,<=,>=,!=
      =?  等於,或false,null
      =like _代表一個字符 %為匹配多個字符
      like  相當於 =like  加上了 %str%
      not like
      ilike(大小寫不敏感)
      not ilike 大小寫不敏感
      =ilike 大小寫不敏感
      child_of  找直接和間接的子對象
      in
      not in       
    #條件可以用邏輯符連起來  用列表類型來組織
      邏輯運算符作為前綴放置於條件前面
      | &  必須兩個條件鏈接 !作用於一個條件  理解時,從里往外剝
     
      & 是且的意思,是默認
      |是或
       ! 是非,相反的意思   
       ['!',('user_id','=',uid)]  不是當前用戶的記錄
       ['|',('user_id','=',uid),('user_id','=',False)] 不是當前用戶,或沒有用戶的記錄
       復雜一點的:
       ['|', ('message_follower_ids', 'in', [user.partner_id.id]),'|', ('user_id', '=', user.id),
             ('user_id', '=', False)]
       邏輯是連后面兩個domain條件
     
       再來一個
       ['|','|',('group_ids','in',[g.id for g in user.groups_id]),('user_id','=',user.id),
         '&',('user_id','=',False),('group_ids','=',False),'|','|',('company_id','=',False),
         ('company_id','child_of',[user.company_id.id]),('company_id.child_ids','child_of',[user.company_id.id])]
       分解理解:
       ['|',
        '|',('group_ids','in',[g.id for g in user.groups_id]),('user_id','=',user.id),
        '&',('user_id','=',False),('group_ids','=',False),
        '|',
        '|',('company_id','=',False),('company_id','child_of',[user.company_id.id]),
        ('company_id.child_ids','child_of',[user.company_id.id])]
      
       domain="[('create_date','=',(context_today() + datetime.timedelta(days=-1)).strftime('%%Y-%%m-%%d'))]"
       domain="[('date','&lt;=',time.strftime('%%d/%%m/%%Y'),
                 ('date','&gt;=',((context_today()-relativedelta(months=3)).strftime('%%d/%%m/%%Y')))]"
       過去三個月
      
    # 在Action中定義,domain用於對象默認的搜索條件
       <field name="domain">[('state','not in',('draft','sent','cancel'))]</filed>
        打開訂單窗口,不搜索處於('draft','sent','cancel') 三種狀態的訂單
       
    # 在對象(或視圖)的關聯字段 字段值 domain 用於過濾
        'product_id':fields.many2one('product.product','Product',domain=[('sale_ok','=',True)],chang_default=True)   
        定義關聯產品,只顯示可銷售產品
        他的值可以用lambda 來表達,這樣可以引入self
        sale_id = fields.Many2one('sale.order', 'Sale Order',
                              domain=lambda self: [('user_id', '=', self.env.uid),('state','not in',('draft','sent','validating','cancel'))],
                              )
        定義的銷售訂單,只顯示是當前登錄用戶的銷售訂單                     
                             
   
    # 在搜索視圖 domain用於自定義過濾條件
        字段
        <field name="name" string="Sale Order" filter_domain="['|'('name', 'ilike',self),('client_order_ref','ilike',self)]"
        在搜索視圖輸入訂單編號,同時按訂單編號和客戶關聯編號搜索
       
        過濾器
        <filter string="My Sales Orders" domain="[('user_id','=',uid)]" help="My Sales Orders" icon="terp-personal"
            name="my_sale_orders_filter"    />
   
    # 在記錄規則中定義 domain 用於定義用戶對對象記錄的訪問權限
       <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
       定義用戶允許查詢未指定分公司或訂單指定分公司用戶具有的訪問權限的銷售訂單
       ['|',('section_id','=',user.default_section_id.id),('section_id','=',False)]
       查看自己的團隊
      
* 實例:
    # 過濾當天的訂單
     [('date_order','<=', datetime.datetime.combine(
       context_today(),datetime.time(23,59,59))),
      ('date_order','>=', datetime.datetime.combine(context_today(), datetime.time(0,0,0)))]

* 代碼分析中
        #在模型中
         'product_id': fields.many2one('product.product', 'Product', required=True, domain=[('type', '<>', 'service')]),
          關聯字段指定產品不能是服務類型
         
        #在視圖中
          @窗體動作,日期小於今天的時間
           <field name="domain">[('date','&lt;=',time.strftime('%Y-%m-%d %H:%M:%S'))]</field>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM