创建自定义报告¶
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视图的表:
重写
BaseModel.init()
方法,设置
_table_query
属性。
无论使用哪种方式,都将执行 SQL 查询来填充模型。因此,可以使用任何 SQL 命令来收集和/或计算所需的数据,并且您需要记住您正在绕过 ORM(如果您还没有阅读过 Odoo中的安全性,这是一个好主意)。从 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
方法是常见的,当然,所有这些方法都会返回字符串。
The _table_query
property is used when the view depends on the context. It is typically
written as follows:
@property
def _table_query(self):
return 'SELECT %s FROM %s' % (self._select(), self._from())
并且遵循与 BaseModel.init()
相同的 _select
和 _from
方法标准。
当用户在多公司和多货币环境中切换时,需要使用属性而不是覆盖 BaseModel.init()
的一个例子是,需要使用货币汇率将与货币相关的金额进行转换。
使用模型¶
您的SQL视图的视图和菜单项的创建和使用方式与任何其他Odoo模型相同。您已经准备好开始使用您的SQL视图了。玩得开心!
额外提示¶
小技巧
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.
小技巧
如果您有一个字段不想作为度量(即在您的透视表或图表视图中),请在其上添加 store=False
,它将不会显示。