Odoo search 搜索視圖詳解與搜索視圖工做原理

轉載請註明原文地址:http://www.javashuo.com/article/p-mwuqogxu-ch.htmlhtml

 

搜索視圖

    搜索視圖的search標籤自己沒什麼屬性能夠使用,只要是<search></search>標籤之間的內容定義了搜索動做。

   1:field

    field標籤訂義了用於搜索過濾的字段有哪些。python

    searchview中的field字段只是說明了能夠用哪些字段來做過濾,而且在搜索框輸入時會自動啓用搜索字段的模糊搜索功能以供候選sql

    可有如下幾種屬性,進一步指定使用某些字段的某些過濾條件進行記錄篩選dom

  • name -- 做爲過濾條件的字段名
  • string -- 字段的label
  • operator -- 默認狀況下field會生成[(name, operator, provided_value)]格式的表達式,其中name是字段名,provided_value是用戶提供的值,operator屬性可被重寫默認的運算符(默認狀況下是根據字段類型分配,數字型是=,字符型是ilike)
  • filter_domain -- 用於搜索的完整的domain表達式,能夠用self變量來表明當前記錄的當前字段值,當operator和filter_domain同時賦值時,filter_domain有最高優先級

 

<field name="name" filter_domain="['|', '|', ('明確的字段內容', 'ilike', self), ('shortdesc', 'ilike', self), ('name', 'ilike', self)]" string="Theme"/>

 

  • context -- 上下文的值。【具體用法:待研究】
  • groups -- 使該字段只對某些用戶組可用。
  • widget -- 使用指定的搜索部件(惟一的用例是V8的many2one字段選擇插件
  • domain -- 若是用於搜索的字段是 關聯字段,使用domain來過濾候選的搜索選項

 

   2:filter

    過濾器,比filed字段更具體。searchview中的field字段只是說明了能夠用哪些字段來做過濾,而且在搜索框輸入時會自動啓用搜索字段的模糊搜索功能以供候選;而filter則更加具體,它的domain屬性或context屬性,指明瞭具體的字段值過濾條件,符合條件的記錄纔會做爲最終搜索結果顯示出來。ide

  • string (required) -- 過濾器的label
  • domain -- 一個domain表達式,被添加到action的domain表達式中,做爲搜索的domain表達式一部分,做用於最終的記錄過濾。
  • context -- 一個python字典對象,被合併到action的domain表達式中,用於傳遞搜索的domain表達式的值
filter中的context,是dict類型。
a)傳遞分組依據:
context="{'group_by':'字段'}"
b)爲domain表達式傳遞變量值
context="{'key':value}"
  • name -- 過濾器的邏輯名【在action跳轉到搜索視圖時,能夠在context中指明默認啓用哪一個filter,就是經過name值來啓用的
        <record id="action_hr_timesheet_attendance_report" model="ir.actions.act_window">
            <field name="context">{'search_default_過濾器name': True}</field>
        </record>
  • help -- 過濾器的描述文字
  • groups -- 指定過濾器可用的用戶組。

   

   3:separator

    分割線。用於將過濾器按組分開,更好看。函數

 

   4:group

    分局佈局,用於過濾器比較多的狀況下,分組排放。佈局

 


    5:默認搜索

搜索字段和過濾條件能夠經過action的context使用search_default_name 配置,對於字段就是須要搜索的值,對過濾器它是一個布爾值:ui

{
  'search_default_foo': 'acro',
  'search_default_bar': 1
}
#自動激活bar過濾器,並在foo字段搜索acro


  綜上,搜索視圖的過濾條件制定有2種方式:

    1)經過filter的domain屬性。表達式的值:spa

       a)能夠是具體的明確值;插件

       b)能夠是python運算表達式(不過不能取具體記錄字段值,能夠是python語言自己的一些庫函數調用的運算表達式)。

       c)能夠是一個變量名,變量值則經過context來賦予。通常用於制定默認搜索條件,在context中傳遞key:value。

<filter name="" string=""
        domain="[('字段', '比較運算符', 值[值能夠是具體的明確值;也能夠是python運算表達式(不過不能取具體記錄字段值,能夠是python語言自己的一些庫函數調用的運算表達式)]))]"/>

    2)經過action的domain字段:action中的domain表達式,會在跳轉時自動應用

       <record id="action_" model="ir.actions.act_window">
            <field name="name"></field>
            <field name="res_model"></field>
            <field name="domain">[(表達式)]</field>
        </record>

 

  搜索條件的工做原理:

    odoo模型中有個方法:read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)

   該方法用於讀取搜索視圖上的過濾條件,並使用過濾條件搜索模型記錄。

   其中,domain是一個list,裏面是一個個的表達式,由 action中的domain+fiter中的domain+界面上臨時應用的篩選條件 拼接而成。

   工做流程爲:

   action打開tree視圖——調用模型的read_group()函數,根據domain條件,調用模型的search(domain)進行檢索——把記錄集返回界面上呈現;

   每當界面上點擊了 篩選——過濾器  或 篩選——自定義篩選  ,都會調用一次read_group()函數,從新拼接domain列表,並檢索模型數據。【多維分析中也是該邏輯,不過是從sql查詢出來的view做爲數據源,從中篩選數據】

  【能夠重寫模型的該方法,自定義記錄的篩選邏輯。

相關文章
相關標籤/搜索