Creating Odoo Models
Steps
- •
Create the Python file in
models/directory (e.g.models/my_model.py). - •
Define the model class:
pythonfrom odoo import models, fields, api, _ from odoo.exceptions import ValidationError class MyModel(models.Model): _name = 'my.model' _description = 'My Model' _order = 'sequence, name' name = fields.Char(string='Name', required=True) sequence = fields.Integer(default=10) active = fields.Boolean(default=True) state = fields.Selection([ ('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done'), ], default='draft', string='Status', tracking=True) partner_id = fields.Many2one('res.partner', string='Partner') line_ids = fields.One2many('my.model.line', 'model_id', string='Lines') tag_ids = fields.Many2many('my.model.tag', string='Tags') total = fields.Float(compute='_compute_total', store=True) @api.depends('line_ids.amount') def _compute_total(self): for record in self: record.total = sum(record.line_ids.mapped('amount')) @api.constrains('name') def _check_name(self): for record in self: if record.name and len(record.name) < 3: raise ValidationError(_("Name must be at least 3 characters.")) def action_confirm(self): self.write({'state': 'confirmed'}) - •
Register in
__init__.py: Addfrom . import my_modelinmodels/__init__.py. - •
Add to manifest: Ensure
models/is imported in the module's root__init__.py. - •
Add security: Create ACL in
security/ir.model.access.csv. - •
Create views: Add form and list views in
views/my_model_views.xml.
Checklist
- •
_nameand_descriptionset - • Fields defined with proper types and attributes
- • Computed fields have
@api.depends - • Constraints use
@api.constrains - • Model registered in
__init__.pychain - • ACL entry in
ir.model.access.csv - • Views created (at minimum form + list)
- • Added to
__manifest__.pydata list