将 sql 查询转换为 ORM Odoo
Convert sql query to ORM Odoo
我在 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 domain,ORDER
BY 将替换为订单参数 (order='read_date desc'
),并且 LIMIT
子句可用作参数 ( limit='1'
).
例如,第二个 select 查询可以替换为:
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() followed by a read(),但避免了必须执行两个请求并保留 ids。
其参数类似于search()’s, but it can also take a list of fields
(like read(),如果未提供该列表,它将获取匹配记录的所有字段)
示例:
self.env['dailycharges'].search_read([('billstatus', '=', record['id']), ('status', '=', 'B')], ['read_date'], order='read_date DESC', limit=1)
[{'id': ?, 'read_date': ?}]
我在 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 domain,ORDER
BY 将替换为订单参数 (order='read_date desc'
),并且 LIMIT
子句可用作参数 ( limit='1'
).
例如,第二个 select 查询可以替换为:
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() followed by a read(),但避免了必须执行两个请求并保留 ids。
其参数类似于search()’s, but it can also take a list of fields
(like read(),如果未提供该列表,它将获取匹配记录的所有字段)
示例:
self.env['dailycharges'].search_read([('billstatus', '=', record['id']), ('status', '=', 'B')], ['read_date'], order='read_date DESC', limit=1)
[{'id': ?, 'read_date': ?}]