How to Implement SQL Views (_auto = False) in Odoo?

✅ What is _auto = False?

In Odoo, models by default create a new database table when defined. However, when you define:

_auto = False

…you instruct Odoo not to create a table, because your model will be based on an existing SQL view or table.

🧪 Why Use SQL Views in Odoo?

  • To create reporting models for dashboards and KPIs.
  • For complex data aggregations (e.g., sums, joins) that are faster in SQL.
  • To expose read-only computed data to Odoo UI, exports, or APIs.

 📌 Realistic  Examples : Sales Summary by Customer

1. Define the Model Using _auto = False

class SaleReportCustomer(models.Model):

    _name = ‘sale.report.customer’

    _description = ‘Sales Report by Customer’

    _auto = False

    _rec_name = ‘partner_id’

    partner_id = fields.Many2one(‘res.partner’, string=‘Customer’)

    total_amount = fields.Float(string=‘Total Sales Amount’)

    order_count = fields.Integer(string=‘Number of Orders’)

2. Create the SQL View Using init()

def init(self):

    tools.drop_view_if_exists(self._cr, self._table)

    self._cr.execute(f“””

        CREATE OR REPLACE VIEW {self._table} AS (

            SELECT

                row_number() OVER () AS id,

                s.partner_id,

                COUNT(s.id) AS order_count,

                SUM(s.amount_total) AS total_amount

            FROM sale_order s

            WHERE s.state IN (‘sale’, ‘done’)

            GROUP BY s.partner_id

        )

    “””)

⚠️ Key Points

Concept
Details
_auto = False Prevents Odoo from creating a DB table.
init() method Used to manually create SQL view via raw SQL.
tools.drop_view_if_exists() Utility to safely recreate views on module upgrade.
id field Must be present and unique in the view for Odoo to work properly.

🧪 Usage in Odoo

You can now use this model:

  • In tree views and pivot tables for custom dashboards.
  • For exporting summarized data.
  • For KPI widgets on custom dashboards.

<record id=”view_sale_report_customer_tree” model=”ir.ui.view”>

   <field name=”name”>sale.report.customer.tree</field>

    <field name=”model”>sale.report.customer</field>

    <field name=”arch” type=”xml”>

        <tree>

            <field name=”partner_id”/>

            <field name=”order_count”/>

            <field name=”total_amount”/>

        </tree>

    </field>

</record>

✅ Summary Table

Feature
Behavior
_auto = False Tells Odoo not to create a DB table
SQL view Must be created manually via init()
Read-only model Cannot use create(), write(), or unlink()
Use case Reporting, analytics, summarized KPIs