在整理英语单词开发模块的过程中,有这样一个需求,就是我在查询界面里输入一个查询的值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参数即可实现手机端的调用,接下来让我们拭目以待。