Skip to content

Odoo Custom Development

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.xml
{
'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,
}
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)
FieldUsage
CharShort text
TextLong text
Integer / Float / MonetaryNumbers
BooleanTrue/False
Date / DatetimeDates
SelectionDropdown list
Many2oneForeign key
One2manyReverse relation
Many2manyJunction table
class SaleOrder(models.Model):
_inherit = 'sale.order'
custom_field = fields.Char(string='Custom Field')
# Search
records = self.env['my.model'].search([('amount', '>', 100)])
# Create
record = self.env['my.model'].create({'name': 'Test', 'amount': 50})
# Write
record.write({'amount': 200})
# Unlink
record.unlink()
# Browse by ID
record = self.env['my.model'].browse(42)