[Odoo 18] Mengenal ORM di Odoo: Model & Field

Pendahuluan

Dalam pengembangan modul Odoo, Model dan Field adalah pondasi utama yang harus kita pahami sebagai developer. Keduanya merupakan inti dari bagaimana data disimpan, diolah, dan ditampilkan dalam sistem ERP Odoo. Memahami konsep ini akan memudahkan kita untuk:

  • Membuat struktur data baru sesuai kebutuhan bisnis.

  • Memodifikasi model yang sudah ada di Odoo.

  • Menghubungkan data menggunakan relasi (many2one, one2many, many2many).

  • Menambahkan logika bisnis yang sesuai melalui method dan constraint.

Tanpa pemahaman yang kuat terhadap Model dan Field, pengembangan modul Odoo akan terasa membingungkan dan mudah menimbulkan kesalahan. Oleh karena itu, materi ini menjadi dasar wajib sebelum melangkah ke tahap-tahap teknis berikutnya seperti view, automation, atau integrasi.

A. Model (Object)

Model (disebut juga sebagai Object) adalah representasi dari tabel di database. Model biasanya disimpan di file Python (.py) dalam folder models/. Model dalam Odoo merupakan kelas Python yang digunakan untuk mengelola:

  • Struktur data (field / kolom)

  • Relasi antar data (one2many, many2one, dll)

  • Logika bisnis (method / fungsi)

  • Hak akses, validasi, hingga constraint data

Model di Odoo terbagi menjadi tiga jenis, yaitu:

1. Model (models.Models)

  • Tipe model paling umum digunakan untuk menyimpan data utama seperti:  customer, product, invoice, dll.
  • Data disimpan secara permanen di database.

Berikut adalah contoh dari Model:

class ResPartner(models.Model):
_name = 'res.partner'

2. Transient Model (models.TransientModel)

  • Biasanya digunakan untuk proses: import, export, confirm action, wizard (popup), dan lainnya.
  • Data hanya disimpan sementara dan akan otomatis dihapus.

Berikut adalah contoh dari Transient Model:

class BookReportWizard(models.TransientModel):
_name = 'book.report.wizard'

start_date = fields.Date()
end_date = fields.Date()

3. Abstract Model (models.AbstractModel)

  • Bisa diwariskan oleh model lain untuk mewarisi fungsi / field.
  • Tidak membuat tabel di database.

  • Cocok untuk membuat mixin (logika reusable).

Berikut adalah contoh dari Abstract Model:

class AuditMixin(models.AbstractModel):
_name = 'audit.mixin'

created_by = fields.Many2one('res.users', string="Created By")

B. Atribut Model

Model di Odoo memiliki atribut yang digunakan untuk mengatur sebuah model bekerja, mengatur model agar dapat berinteraksi dengan database, dan mengatur agar model tersebut dikenali oleh sistem Odoo. Atribut model biasanya diletakkan setelah model tersebut di deklarasikan. Berikut adalah atribut model yang biasa digunakan di Odoo, seperti: 

Berikut adalah contoh penerapan atribut di dalam suatu model:

class Book(models.Model):
_name = 'library.book'
_description = 'Book'
_rec_name = 'title'
_order = 'release_date desc'

C. Fields

Fields adalah representasi dari kolom didalam tabel database. Fields biasanya disimpan di file Python (.py) dalam folder models/. Odoo menyediakan berbagai tipe field diantaranya seperti: 

Berikut adalah contoh dalam penerapan fields di dalam suatu model:

title = fields.Char(string="Title", required=True)
release_date = fields.Date(string="Release Date")
price = fields.Float(string="Price")
author_id = fields.Many2one('res.partner', string="Author")

D. Atribut Fields

Sama seperti model, fields juga memiliki atribut yang berfungsi untuk mengontrol perilaku dan tampilan dari sebuah field seperti menentukan apakah field wajib diisi, mengatur label dan deskripsi field, menentukan aksesibilitas (readonly, invisible), dll. Odoo menyediakan berbagai atribut yang dapat ditambahkan saat mendeklarasikan field diantaranya seperti berikut: 

Berikut adalah contoh dari penerapan atribut fields.

is_available = fields.Boolean(string="Available", default=True)
total_pages = fields.Integer(string="Total Pages", required=True, help="Jumlah halaman dalam buku")

Berikut adalah contoh dari penerapan compute field:

from odoo import api

class Book(models.Model):
_name = 'library.book'

page_count = fields.Integer()
read_time = fields.Float(compute='_compute_read_time', store=True)

@api.depends('page_count')
def _compute_read_time(self):
for record in self:
record.read_time = record.page_count * 1.5

​Ingin pahami Odoo lebih dalam atau butuh bantuan teknis? Arkana siap membantu!

  Writer

Fadli Fatanah
Software Engineer



Share this post
Tags
Odoo 18 Development Module: Struktur, File, dan Alurnya (Module Development Basics)