Преобразование запроса sql в ORM Odoo - PullRequest
1 голос
/ 17 июня 2020

У меня есть функция в файле модели для структуры ODOO. Я только что наткнулся на SQL запросов в своих функциях. Я просто хочу преобразовать запрос SQL в ORM с помощью Odoo framework. Нравится, создавать, искать, просматривать встроенные функции, которые у него уже есть. Мне просто нужны несколько примеров для двух запросов, которые у меня есть в функции ниже, например, как мы конвертируем его в 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. Заранее спасибо.

1 Ответ

1 голос
/ 17 июня 2020

Их можно заменить методом search. Предложение WHERE будет преобразовано в домен поиска , ORDER 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 () , но избегает необходимости выполнять два запрашивает и сохраняет идентификаторы.

Его аргументы аналогичны аргументам search () , но также могут принимать список fields (например, read () , если этот список не предоставлен, будут извлечены все поля совпадающих записей)

Пример:

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

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