【问题标题】:Convert sql query to ORM Odoo将sql查询转换为ORM Odoo
【发布时间】:2020-06-17 14:56:44
【问题描述】:

我在 ODOO 框架的模型文件中有一个函数。我刚刚在我的函数中遇到了 SQL 查询。我只想使用 Odoo 框架将 SQL 查询转换为 ORM。 喜欢、创建、搜索、浏览它已经拥有的内置功能。对于下面函数中的两个查询,我只需要一些示例,例如我们如何将其转换为 ORM 并提供良好的解释。这样我也可以对其他查询进行相同的处理。

功能:

def bill(self,data):

    id = data.get('id', False)
    if data:
        chge = []
        s_Date = data['start_date']
        e_Date = data['end_date']
        query = """SELECT "endpoll","table_name","kcp","plan","startpoll",id FROM 
        bill WHERE ((("endpoll" >= '%s')  OR  "endpoll" IS NULL )  AND  ("startpoll" <= '%s')  AND  
        ("customer" = %s)  AND  ("active" in ('Y','N'))) ORDER BY "startpoll" """ % (
        s_Date, e_Date, id)
        self._cr.execute(query)
        status_records = self._cr.dictfetchall()
        if not status_records:
            return []
        gst = 0
        for records in status_records:
            icp_id = record['ikp']
            varcharge = 0
            query2 = """SELECT "read_date" FROM dailycharges WHERE (("billstatus" = %s)  
            AND  ("status" = 'B')) ORDER BY "read_date" desc limit 1""" % (
                record['id'])
            self._cr.execute(query2)
            maxbill = self._cr.fetchone()
            if maxbill:
                unbill = datetime.strptime(maxbill[0]

            else:
                unbill = record['Start_Date']
            start_date = max(invoice_start_date, str(unbill))

    return data

这个函数中有两个简单的查询。我需要将它们转换为 ORM。提前致谢。

【问题讨论】:

  • 它们可以替换为search 方法。 WHERE 子句将转换为 search domainORDER BY 将替换为 order 参数 (order='read_date desc'),LIMIT 子句可用作参数 (limit='1')。
  • @Kenly 如果可能的话,你能把它作为一个查询放在一行中吗?
  • 我们需要定义 bill 和 dailycharges 模型。

标签: python odoo odoo-12


【解决方案1】:

它们可以替换为search 方法。 WHERE 子句将转换为 search domainORDER BY 将替换为订单参数 (order='read_date desc'),LIMIT 子句可用作参数 (limit='1')。

例如,第二个选择查询可以替换为:

record = self.env['dailycharges'].search([('billstatus', '=', record['id']), ('status', '=', 'B')], order='read_date DESC', limit=1)
# read_date = record.read_date

编辑:
您可以使用search_read 方法,该方法允许您指定要读取的字段。

Odoo 提供了一个 search_read() 快捷方式,顾名思义,它等同于 search() 后跟 read(),但避免了执行两个请求并保留 ID。

它的参数类似于search()的,但它也可以获取fields的列表(如read(),如果没有提供该列表,它将获取匹配记录的所有字段)

示例:

self.env['dailycharges'].search_read([('billstatus', '=', record['id']), ('status', '=', 'B')], ['read_date'], order='read_date DESC', limit=1)

[{'id': ?, 'read_date': ?}]

【讨论】:

  • 但是我们是否只获取 read_date 列?如果是,我们在哪里提到它。
  • 搜索方法将返回一个记录集,您可以使用点符号访问所有字段。检查我的编辑
猜你喜欢
  • 2016-04-20
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 2021-07-06
  • 2018-06-10
  • 2019-06-11
相关资源
最近更新 更多