Operacje na modelach w przykładach

Przykład 1. Kopiowanie firmy.

company=self.env['res.company'].sudo().search_read(domain=[('id','=',1),], fields=[])[0]
new={}
for field,value in company.iteritems():
    if field<>'id' and (isinstance(value, int) or isinstance(value, str) or isinstance(value,bool)):
        new[field]=value
new['name']='nowa nazwa'
self.env['res.company'].sudo().create(new)
self.env.cr.commit()

Objaśnienie:

Model res.company opisuje dane przedsiębiorstw (tabela res_company). W pierwszym wierszu odczytujemy dane firmy o kluczu (i) równym 1. Zastosowano funkcję searchread, gdyż zwraca ona dane w postaci słownika (dict). Dokładniej -listy słowników - dlatego nakocu pobieramy element 0 z tej listy ([0]). W następnych trzech wierszach przepisujemy do nowego słownika (new) te elementy odczytanego słownika, które są typu int, str lub bool.

Potem zmieniamy nazwę firmy (element name).

Ostatnie dwie linijki to utworzenie nowego rekordu. najpierw funkcją create tworzymy rekord (argumentem jest słownik danych), a potem wykonujemy zamknięcie transakcji (commit) by dane znalazły się w bazie.

Przykład 2. Wykorzystanie widoków w bazie danych

# -*- coding: utf-8 -*-

from odoo import _, api, fields, models

class myShelf(models.Model):
    _name = 'sale.done'
    _auto = False

    id = fields.Integer('ID', readonly=True)
    partner_id = fields.Many2one(comodel_name='res.partner', string='Partner', readonly=True)
    name = fields.Char('Name', readonly=True)
    date = fields.Date('Date', readonly=True)

    @api.model_cr
    def init(self):
        self._cr.execute("""
CREATE OR REPLACE VIEW sale_done AS (
select ol.id id, ol.order_partner_id partner_id, ol.name, ol.create_date date
from sale_order_line ol
join product_template pt on ol.product_id=pt.id
where ol.state = 'done'
        );""" )

W tym przykładzie tworzony jest widok (view) w bazie danych - o nazwie saledone. Zawiera tylko te transakcje sprzedaży, które zostały zakończone (zapłacone). Kluczowe znaczenie ma tutaj wartość pola - zapobiega to automatycznemu tworzeniu tabel prze ORM. W miejsce tego tworzymy funkcje init, która tworzy w bazie danych widok sale_done (poprzez wykonanie zapytania SQL). Kolumny tego widoku są automatycznie mapowane na odpowiednie pola modelu. Zauważmy, że pole partner_id jest typu Many2one. Sprawia to, że odczytując rekord sprzedaży uzyskujemy automatycznie dostęp do danych powiązanego z tą sprzedaży partnera.