カスタムレポートを作成¶
SQLビューは、既存のモデルのフィールドとビューでは表示できないデータを表示するためのカスタマイズされたレポートを作成するための手法です。 言い換えれば、この手法は、データ分析の目的のためだけに、不必要なフィールドの作成や追加の計算を避けることができます。
モデルを作成¶
SQL ビューは、標準モデルと同様の方法で作成されます。
from odoo import fields, models
class ModuleReport(models.Model):
_name = 'module.report'
_description = "Module Report"
_rec_name = 'module_field'
_auto = False
属性:
_auto = False
は、モデルをデータベースに保存したくないことを示します。_rec_name
は、モデルのフィールドがレコードの名前を表すことを示します。 航法のブレッドクラムでレコードのフォームビューを開くときに使用される名前)
フィールドは標準モデルと同じ方法で定義されますが、すべてのフィールドは readonly=True
とマークされています。
注釈
新しいモデルをセキュリティファイルに追加することを忘れないでください。
モデルを追加¶
SQL ビューのテーブルには、以下の 2 つの方法があります。
`BaseModel.init()`メソッドをオーバーライドします
_table_query
プロパティを設定します。
どちらの方法を使用しても、SQLクエリが実行されてモデルが生成されます。 そのため、 任意のSQLコマンドを使用して必要なデータを収集および/または計算することができ、ORMをバイパスしていることに留意してください。 :ref:`reference/security`を読むのは良いアイデアです。 `SELECT`から返されるカラムはモデルのフィールドを入力します ですから、列名がフィールド名と一致することを確認するか、または一致するエイリアス名を使用します。
ほとんどの場合、BaseModel.init()`メソッドをオーバーライドすることは標準的でより良いオプションです。 `tools
をインポートする必要があります。通常は以下のように書かれています。
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
は、SQLクエリの実行時に競合するビューが作成されないことを保証します。 モデル拡張を容易にするために、クエリの異なる部分を分離するのが標準です。 クエリがメソッド間でどのように分割されるかは正確に標準化されているのではなく、最小限にします。 `_select`と`_from`メソッドは一般的で、もちろんこれらのメソッドはすべて文字列を返します。
関連項目
例: BaseModel.init() のオーバーライドを使用する SQL ビュー
_table_query
プロパティは、ビューがコンテキストに依存する場合に使用されます。通常は以下のように記述されます。
@property
def _table_query(self):
return 'SELECT %s FROM %s' % (self._select(), self._from())
そして`_select`と`_from`メソッドの標準値を`BaseModel.init()`に従います。
`BaseModel を上書きする代わりにプロパティを使用する場合の例です。 nit()は、ユーザーが企業間で切り替える際に、通貨に関連する金額を為替レートを使用して変換する必要があるマルチ企業およびマルチ通貨環境です。
モデルを使用¶
SQL ビューのビューとメニューアイテムは、他のどのOdoo モデルと同じ方法で作成され、使用されます。 SQLビューを使用するように設定されています。楽しんでください!
Extra tips¶
ちなみに
SQLビューでよくある間違いは、テーブルJOINに起因する特定のデータの重複を考慮していないことです。 フィールドの「aggregator」および/またはピボットビューを使用すると、誤カウントを引き起こす可能性があります。 SQLビューを十分なデータでテストして、結果として得られるフィールド値が期待どおりであることを確認することが最善です。
ちなみに
指標として望まない項目がある場合 (例: ピボットまたはグラフビューで、`store=False`を追加すると、表示されません。