在整理英語單詞開發模塊的過程中,有這樣一個需求,就是我在查詢界面里輸入一個查詢的值A,這個A可能是下面的任何一個值
1.一個英語單詞 2.漢語文字 3.一個英語單詞的部分
這里有兩張表:english.lexicon 和 english.lexicon.explain,前者是主表記錄單詞信息,后者是從表記錄單詞的解釋,二者是一對多的關系。
from odoo import fields, models class EnglishLexicon(models.Model): _name = 'english.lexicon' _description = 'english lexicon' word = fields.Char(string="Word", required=True, index=True) lexicon_explain_ids = fields.One2many('english.lexicon.explain', 'english_lexicon_id', "Detail") america_accent = fields.Char(string="America Accent") british_accent = fields.Char(string="British Accent") chinese_mean = fields.Text(string="Chinese Mean") america_voice_url = fields.Char(string="America URL") british_voice_url = fields.Char(string="British URL") source_name = fields.Char(string="From") sequence = fields.Integer() is_updated = fields.Boolean(string="Is Updated", default=False) class EnglishLexiconExplain(models.Model): _name = 'english.lexicon.explain' _description = 'english lexicon explain' english_lexicon_id = fields.Many2one('english.lexicon', 'EnglishLexicon', ondelete='cascade', required=True) order = fields.Integer() raw_html_mean = fields.Text(string="Html Mean") gram = fields.Char(string="Gram") english_mean = fields.Text(string="Processed Mean") chinese_mean = fields.Text(string="Chinese Mean") is_format = fields.Boolean(string="Is Format", default=False)
那么這一個參數怎么在odoo中實現這個查詢效果呢,即 select * from tableA where filed1 like '%A%' or field2 like '%A%' 的動態效果呢?
其實在了解了odoo的searchview頁面的基礎知識之后,這個很容易實現,也就幾行代碼的事情。
<record id="english_lexicon_view_search" model="ir.ui.view"> <field name="name">english.lexicon.search</field> <field name="model">english.lexicon</field> <field name="arch" type="xml"> <search string="Search"> <field name="word" filter_domain="['|', ('word', 'ilike', self), ('lexicon_explain_ids.chinese_mean', 'ilike', self)]"/> <field name="chinese_mean"/> </search> </field> </record>
特別注意上面的紅色部分,在瀏覽器中輸入參數,用戶一旦對應word字段,odoo框架就會匹配2個條,word 字段 和 子表的chinese_mean字段作為條件進行查詢。
同時這里也向我們展示了如何通過主表訪問子表的任何一個字段的格式: ( {子表的id集合}.{子表的具體字段}, '操作符合' , '參數值' ) 。



自此我們就完成了多表多字段對應一個參數的查詢,就簡簡單單的在xml文件中做了下配置,這一點上更加體現出了odoo框架的強大。不需要自己再去組織邏輯去動態的拼湊sql語句等功能。
或許這里的意義不止如此,利用這個特性我們甚至不用針對app進行特別的編碼,只需要在ionic的部分傳遞對應的domian參數即可實現手機端的調用,接下來讓我們拭目以待。
