Smart Suggestions
The Smart Suggestions feature in the Odoo VSCode extension is designed to elevate your development workflow by providing intelligent, context-aware code completions. This feature not only accelerates coding but also helps maintain accuracy and consistency across your Odoo modules. Below, you will find a comprehensive and professional overview of how Smart Suggestions work, their technical underpinnings, and how they benefit both new and experienced Odoo developers.
Key Features
- Context-Aware Completions: Suggestions adapt dynamically to your current editing context, whether you are working in Python or XML files.
- Comprehensive Model and Field Discovery: Instantly access all models and fields defined in your workspace, including those introduced by custom modules.
- Deep Relational Traversal: Effortlessly traverse through chains of relational fields, no matter how deeply nested.
- Odoo-Specific Patterns: Recognizes and suggests completions for Odoo ORM, API decorators, XML view definitions, and more.
- Automatic Updates: Suggestions are always in sync with your codebase, updating as you add, remove, or modify models and fields.

How Smart Suggestions Work
The extension continuously scans your workspace for Python files that define Odoo models. It parses class definitions, extracts model names (from _name
, _inherit
, _inherits
), and collects all field definitions, including their types and relational targets. This information is cached and updated in real time as you edit your code, ensuring that suggestions are always accurate and up-to-date.
When you trigger a completion (e.g., by typing or pressing Ctrl+Space
), the extension analyzes your current context—such as the line you are editing, the surrounding code, and the file type—to determine the most relevant suggestions. For relational fields, it can follow chains of relationships, providing field suggestions for the final related model, no matter how many levels deep you traverse.
Actual Suggestion Contents and Triggers
Python Suggestions
Model Name Suggestions
- Trigger Contexts:
- Assigning to
_inherit
,_name
, or_inherits
(e.g.,_inherit = "|"
) - Accessing models via
self.env['|']
- Defining relational fields:
fields.Many2one("|"), fields.One2many("|"), fields.Many2many("|")
- Setting
comodel_name="|"
in field definitions
- Assigning to
- Suggestions Provided:
- All model names detected in your workspace, including those from custom modules and dependencies.
Field Name Suggestions
- Trigger Contexts:
- Inside API decorators:
@api.depends('|')
,@api.onchange('|')
,@api.constrains('|')
- When accessing fields on a record:
self.some_field.|
- In method definitions:
def _compute_|
,def _inverse_|
,def _search_|
- Inside API decorators:
- Suggestions Provided:
- All field names for the current model, or for the related model if traversing through relational fields. Each suggestion includes the field type and, for relational fields, the related model.
Relational Field Traversal
- How it Works:
- The extension supports unlimited traversal through relational fields. For example, typing
self.order_line.product_id.categ_id.
will suggest all fields of theproduct.category
model, following the chain of relationships from the current model. - This is invaluable for advanced Odoo development, where models often reference each other through complex relationships.
- The extension supports unlimited traversal through relational fields. For example, typing
Inverse/Compute/Search Method Suggestions
- Trigger Contexts:
- When defining methods like
def _compute_|
,def _inverse_|
,def _search_|
- When defining methods like
- Suggestions Provided:
- Field names of the current model, filtered as you type after the underscore.
XML Suggestions
Model Name Suggestions
- Trigger Contexts:
- In
<field name="model">|</field>
,<record model="|"
, and<field name="res_model">|</field>
- In
- Suggestions Provided:
- All model names from your workspace, ensuring consistency between your Python and XML code.
Field Name Suggestions
- Trigger Contexts:
- In
<field name="|">
when the model context is known (e.g., inside a form view or after specifying<field name="model">
)
- In
- Suggestions Provided:
- All field names for the detected model, with type and related model (if any) in the suggestion details.
View Types, Widgets, and Classes
- Trigger Contexts:
- In
<field name="view_mode">|</field>
: Suggests view types likeform
,tree
,kanban
, etc. - In
<field name="name" widget="|"/>
: Suggests available Odoo widgets. - In
<field name="name" class="|"/>
: Suggests CSS classes found in your project.
- In
How Deep Relational Traversal Works
- The extension parses all models and fields in your workspace, including the type and related model for relational fields.
- When you type a chain like
self.a.b.c.
, it will:- Identify the model of
self
(the current class). - For each field in the chain, if it is a relational field, it will follow the
related
model. - At the end of the chain, it will suggest all fields of the final model.
- Identify the model of
- This works for any depth, as long as each field in the chain is a valid relational field.
- Edge Case Handling: If a field in the chain is not a recognized relational field, suggestions will stop at that point, ensuring only valid completions are offered.
Example Scenarios
Python
class SaleOrder(models.Model):
_name = 'sale.order'
partner_id = fields.Many2one('res.partner')
order_line = fields.One2many('sale.order.line', 'order_id')
class SaleOrderLine(models.Model):
_name = 'sale.order.line'
product_id = fields.Many2one('product.product')
# Typing:
self.order_line.product_id. # Suggests all fields of 'product.product'
XML
<record model="ir.ui.view" id="view_form">
<field name="model">sale.order</field>
<field name="arch" type="xml">
<form>
<field name="partner_id"/> <!-- Suggests all fields of 'sale.order' -->
</form>
</field>
</record>
Other Context-Aware Suggestions
- API Decorators: Suggests field names for
@api.depends
,@api.onchange
,@api.constrains
. - Import Statements: Suggests common Odoo imports and module names for rapid development.
- Action Definitions: Suggests model names for
res_model
in actions, reducing manual lookup. - View Modes: Suggests
form
,tree
,kanban
, etc., forview_mode
fields in XML. - Widgets: Suggests available Odoo widgets in XML, helping you leverage advanced UI features.
Summary Table
Context (Python) | What is Suggested |
---|---|
_inherit = " , env[' | All model names |
fields.Many2one(" | All model names |
comodel_name=" | All model names |
@api.depends(' | All field names of current model |
self.field. | All fields of related model |
self.a.b.c. | Fields of final related model |
def _compute_ | Field names of current model |
Context (XML) | What is Suggested |
---|---|
<field name="model"> | All model names |
`<record model=" | "` |
`<field name=" | ">` |
<field name="view_mode"> | View types (form, tree, etc.) |
`<field name="name" widget=" | "` |
`<field name="name" class=" | "` |
These suggestions are always up-to-date with your workspace, and will update automatically as you add or change models and fields.
Benefits for All Developer Levels
For Beginners
- Guided Development: Reduces the learning curve by surfacing available models, fields, and Odoo-specific patterns as you type.
- Error Prevention: Minimizes typos and incorrect references, helping you write working code faster.
For Advanced Users
- Productivity Boost: Accelerates development by reducing the need to manually look up model and field names.
- Advanced Traversal: Supports complex model relationships and advanced Odoo patterns, making it ideal for large projects.
- Consistency: Ensures that code references remain consistent across Python and XML files.
How Suggestions Stay Up-to-Date
- The extension uses file system watchers to monitor changes in your Python files. When you add, remove, or modify models and fields, the internal index is refreshed automatically.
- No manual refresh is needed—your suggestions are always current with your codebase.
Troubleshooting & Tips
- Suggestions Not Appearing?
- Ensure your workspace is open at the root of your Odoo project.
- Check that your Python files are saved and free of syntax errors.
- If you recently added new models or fields, try saving all files or reloading the VSCode window.
- Performance: For very large codebases, initial indexing may take a few seconds. Suggestions will become more responsive as the index is built.
- Custom Patterns: If you use non-standard model or field definitions, ensure they follow Odoo conventions for best results.
Tips for Effective Use
Context Awareness
- Suggestions adapt to your current context
- Different suggestions for Python vs XML
- Model-aware field suggestions
Keyboard Shortcuts
- Use
Ctrl+Space
to trigger suggestions Tab
to accept suggestionsEsc
to dismiss suggestions
- Use
Next Steps
- Explore Code Snippets for more code generation features
- Learn about Code Inspection for quality checks
- Check out Best Practices for development guidelines