### 图像视图 图的视图允许汇总汇总和分析模型,它们的根元素是 `<graph>`. 图形视图有4个显示模式,使用的默认模式是使用 `@type` 属性. Pivot 多维表,允许各种尺寸的选择得到合适的聚合数据集之前,移动到一个更图形概述 Bar (默认) 一个条形图,第一维是用来定义在水平轴上的组,其他维度定义在每个组中的聚集的酒吧。 默认的酒吧是并排的,他们可以堆叠使用 `@stacked="True"` 在 `<graph>` 上 Line 二维直线图 Pie 2维的饼图 图视图包含 `<field>` 具有强制性 `@type` 属性取值: `row` (默认) 该字段应为默认聚合 `measure` 该领域应汇总,而不是分组 ~~~ xml <graph string="Total idea score by Inventor"> <field name="inventor_id"/> <field name="score" type="measure"/> </graph> ~~~ Warning 图形视图对数据库执行的聚合值,他们不与非存储计算字段。 练习 图像视图 在每一个过程中,在一个条形图的形式下,为每一个过程,显示的次数增加一个图形视图。 1. 添加作为存储计算字段的参与者数量 2. 然后添加相关视图 *openacademy/models.py* ~~~ python hours = fields.Float(string="Duration in hours", compute='_get_hours', inverse='_set_hours') attendees_count = fields.Integer( string="Attendees count", compute='_get_attendees_count', store=True) @api.depends('seats', 'attendee_ids') def _taken_seats(self): for r in self: ~~~ ~~~ python for r in self: r.duration = r.hours / 24 @api.depends('attendee_ids') def _get_attendees_count(self): for r in self: r.attendees_count = len(r.attendee_ids) @api.constrains('instructor_id', 'attendee_ids') def _check_instructor_not_in_attendees(self): for r in self: ~~~ *openacademy/views/openacademy.xml* ~~~ xml </field> </record> <record model="ir.ui.view" id="openacademy_session_graph_view"> <field name="name">openacademy.session.graph</field> <field name="model">openacademy.session</field> <field name="arch" type="xml"> <graph string="Participations by Courses"> <field name="course_id"/> <field name="attendees_count" type="measure"/> </graph> </field> </record> <record model="ir.actions.act_window" id="session_list_action"> <field name="name">Sessions</field> <field name="res_model">openacademy.session</field> <field name="view_type">form</field> <field name="view_mode">tree,form,calendar,gantt,graph</field> </record> <menuitem id="session_menu" name="Sessions" ~~~