Egyedi jelentések létrehozása¶
Az SQL nézetek egy technika az egyedi jelentések létrehozására, hogy olyan adatokat jelenítsenek meg, amelyeket a meglévő modellek mezőivel és nézeteivel nem lehet megjeleníteni. Más szavakkal, ez a technika segít elkerülni a további mezők felesleges létrehozását és számítását kizárólag adatelemzési célokra.
Modell létrehozása¶
Egy SQL nézet hasonló módon jön létre, mint egy standard modell:
from odoo import fields, models
class ModuleReport(models.Model):
_name = 'module.report'
_description = "Module Report"
_rec_name = 'module_field'
_auto = False
Ahol az attribútumok:
_auto = Falsejelzi, hogy nem akarjuk a modellt az adatbázisban tárolni_rec_namejelzi, hogy a modell melyik mezője képviseli a rekord nevét (azaz a nevet, amelyet a navigációs morzsában használnak, amikor megnyitnak egy rekord űrlap nézetét)
és mezői ugyanúgy vannak definiálva, mint egy standard modell esetében, kivéve, hogy minden mező readonly=True jelöléssel van ellátva.
Megjegyzés
Ne felejtsd el hozzáadni az új modellt a biztonsági fájlodhoz.
Töltsd fel a modellt¶
Két módja van egy SQL nézet táblájának feltöltésére:
felülírni a
BaseModel.init()metódust,beállítani a
_table_querytulajdonságot.
Függetlenül attól, hogy melyik módot használjuk, egy SQL lekérdezés fog végrehajtódni a modell feltöltésére. Ezért bármilyen SQL parancs használható az adatok összegyűjtésére és/vagy kiszámítására, és fontos szem előtt tartani, hogy megkerüljük az ORM-et (azaz érdemes átolvasni a Biztonság az Odoo-ban részt, ha még nem tetted meg). A SELECT által visszaadott oszlopok fogják feltölteni a modell mezőit, ezért győződj meg róla, hogy az oszlopnevek megegyeznek a mezőnevekkel, vagy használj olyan alias neveket, amelyek megegyeznek.
A legtöbb esetben a BaseModel.init() metódus felülírása a szokásos és jobb megoldás. Ehhez szükséges a tools importálása, és általában a következőképpen van megírva:
def init(self):
tools.drop_view_if_exists(self.env.cr, self._table)
self.env.cr.execute("""CREATE or REPLACE VIEW %s as (
SELECT
%s
FROM
%s
)""" % (self._table, self._select(), self._from()))
tools.drop_view_if_exists biztosítja, hogy ne jöjjön létre ütköző nézet az SQL lekérdezés végrehajtásakor. Általános gyakorlat, hogy a lekérdezés különböző részeit elválasztjuk, hogy megkönnyítsük a modell kiterjesztését. Az, hogy pontosan hogyan van felosztva a lekérdezés a metódusok között, nincs szabványosítva, de minimum az _select és _from metódusok gyakoriak, és természetesen ezek a metódusok mind sztringeket fognak visszaadni.
A _table_query tulajdonságot akkor használjuk, amikor a nézet a kontextustól függ. Általában a következőképpen van megírva:
@property
def _table_query(self):
return 'SELECT %s FROM %s' % (self._select(), self._from())
és követi ugyanazokat az _select és _from metódus szabványokat, mint a BaseModel.init().
Egy példa arra, amikor a tulajdonságot a BaseModel.init() felülírása helyett kell használni, egy több vállalatot és több valutát kezelő környezet, ahol a valutával kapcsolatos összegeket át kell váltani árfolyamok használatával, amikor a felhasználó vállalatok között vált.
Használja a modellt¶
Az SQL nézetekhez tartozó nézetek és menüpontok ugyanúgy jönnek létre és használhatók, mint bármely más Odoo modell. Készen állsz az SQL nézet használatára. Jó szórakozást!
Extra tippek¶
Javaslat
A common mistake in SQL views is not considering the duplication of certain data
due to table JOINs. This can lead to miscounting when using a field’s aggregator
and/or the pivot view. It is best to test your SQL view with sufficient data to ensure the
resulting field values are as you expect.
Javaslat
Ha van egy meződ, amelyet nem szeretnél mérőszámként használni (azaz a pivot vagy grafikon nézetekben), adj hozzá store=False értéket, és nem fog megjelenni.