Python 将sql查询转换为ORM Odoo

Python 将sql查询转换为ORM Odoo,python,odoo,odoo-12,Python,Odoo,Odoo 12,我在ODOO框架的模型文件中有一个函数。我只是在函数中遇到了SQL查询。我只想用Odoo框架将SQL查询转换为ORM。 比如,创建、搜索、浏览已有的内置函数。我只需要下面函数中的两个查询的一些例子,比如我们如何将其转换为ORM,并给出很好的解释。这样我就可以在其他查询中进行同样的操作 功能: def bill(self,data): id = data.get('id', False) if data: chge = [] s_Date = da

我在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

def账单(自身、数据):
id=data.get('id',False)
如果数据:
chge=[]
s_日期=数据[“开始日期”]
e_日期=数据[‘结束日期’]
query=“”从中选择“endpoll”、“表名称”、“kcp”、“计划”、“startpoll”、id

bill WHERE((((“endpoll”>='%s')或“endpoll”为空)和(“startpoll”它们可以用
搜索
方法替换。
WHERE
子句将转换为,
ORDER
BY将用ORDER参数(
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\u read
方法指定要读取的字段

Odoo提供了一个
search\u read()
快捷方式,顾名思义,该快捷方式相当于a后跟a,但避免了必须执行两个请求并保留ID

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

示例:

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

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

可以用
搜索
方法替换它们。
其中
子句将转换为,
ORDER BY
将替换为
ORDER
参数(
ORDER='read_date desc'
),并且
LIMIT
子句可作为参数(
LIMIT='1'
)@Kenly如果可能,请将其作为一行查询。我们需要账单和日常收费模型的定义。但我们是否仅获取read_date列?如果是,我们在哪里提及它。搜索方法将返回一个记录集,您可以使用点符号访问所有字段。检查我的编辑