Odoo Custom Development
Odoo Module Structure
Section titled “Odoo Module Structure”my_module/├── __init__.py├── __manifest__.py├── models/│ ├── __init__.py│ └── my_model.py├── views/│ └── my_model_views.xml├── security/│ └── ir.model.access.csv└── data/ └── my_data.xmlManifest File
Section titled “Manifest File”{ 'name': 'My Module', 'version': '17.0.1.0.0', 'category': 'Custom', 'depends': ['base', 'sale'], 'data': [ 'security/ir.model.access.csv', 'views/my_model_views.xml', ], 'installable': True,}Defining a Model
Section titled “Defining a Model”from odoo import models, fields, api
class MyModel(models.Model): _name = 'my.model' _description = 'My Custom Model'
name = fields.Char(required=True) amount = fields.Float() partner_id = fields.Many2one('res.partner', string='Customer') line_ids = fields.One2many('my.model.line', 'parent_id')
@api.depends('line_ids.amount') def _compute_total(self): for rec in self: rec.total = sum(rec.line_ids.mapped('amount'))
total = fields.Float(compute='_compute_total', store=True)Common Field Types
Section titled “Common Field Types”| Field | Usage |
|---|---|
Char | Short text |
Text | Long text |
Integer / Float / Monetary | Numbers |
Boolean | True/False |
Date / Datetime | Dates |
Selection | Dropdown list |
Many2one | Foreign key |
One2many | Reverse relation |
Many2many | Junction table |
Inheritance
Section titled “Inheritance”class SaleOrder(models.Model): _inherit = 'sale.order'
custom_field = fields.Char(string='Custom Field')ORM Methods
Section titled “ORM Methods”# Searchrecords = self.env['my.model'].search([('amount', '>', 100)])
# Createrecord = self.env['my.model'].create({'name': 'Test', 'amount': 50})
# Writerecord.write({'amount': 200})
# Unlinkrecord.unlink()
# Browse by IDrecord = self.env['my.model'].browse(42)