Apa Itu Constraints di Odoo?
Constraints di Odoo adalah aturan validasi yang diterapkan pada model untuk memastikan bahwa data yang disimpan memenuhi kondisi tertentu. Dengan constraints, kita dapat mencegah kesalahan data seperti duplikasi, nilai tidak valid, atau pelanggaran aturan bisnis tertentu.
Dalam Odoo, constraints biasanya diterapkan menggunakan decorator @api.constrains
pada model, atau dengan mendefinisikan SQL constraints langsung dalam model.
Menggunakan @api.constrains
@api.constrains
adalah metode yang digunakan dalam model Odoo untuk menerapkan validasi pada field setelah data disimpan (write()
atau create()
).
Sintaks Dasar
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class ExampleModel(models.Model):
_name = 'example.model'
_description = 'Contoh Model'
name = fields.Char(string='Nama', required=True)
age = fields.Integer(string='Usia')
@api.constrains('age')
def _check_age(self):
for record in self:
if record.age < 18:
raise ValidationError('Usia harus minimal 18 tahun!')
Penjelasan
- Decorator
@api.constrains('age')
→ Fungsi_check_age
hanya akan dijalankan jika fieldage
berubah. - Perulangan
for record in self
→ Mengiterasi setiap record yang sedang diperiksa. - Kondisi
if record.age < 18
→ Jika usia kurang dari 18, akan memunculkan error. raise ValidationError('Usia harus minimal 18 tahun!')
→ Menghentikan proses jika kondisi tidak terpenuhi.
Menggunakan SQL Constraints
Selain menggunakan @api.constrains
, kita juga bisa menerapkan SQL constraints langsung dalam model Odoo.
Contoh SQL Constraints
class ExampleModel(models.Model):
_name = 'example.model'
_description = 'Contoh Model dengan SQL Constraints'
name = fields.Char(string='Nama', required=True)
code = fields.Char(string='Kode', required=True)
_sql_constraints = [
('unique_code', 'UNIQUE(code)', 'Kode harus unik!'),
]
Penjelasan
_sql_constraints
→ Daftar constraints SQL yang diterapkan pada tabel database.('unique_code', 'UNIQUE(code)', 'Kode harus unik!')
→ Membuat constraint agar nilaicode
tidak boleh duplikat.
Keunggulan SQL constraints adalah performanya lebih cepat karena dijalankan langsung oleh database, namun kurang fleksibel dibandingkan @api.constrains
.
Contoh Kasus Penggunaan Constraints
1. Validasi Format Email
Jika kita ingin memvalidasi bahwa field email hanya boleh berisi alamat email yang valid:
import re
class ExampleModel(models.Model):
_name = 'example.model'
_description = 'Validasi Email'
email = fields.Char(string='Email')
@api.constrains('email')
def _check_email_format(self):
email_regex = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
for record in self:
if record.email and not re.match(email_regex, record.email):
raise ValidationError('Format email tidak valid!')
2. Melarang Duplikasi Nama
Jika kita ingin mencegah pengguna memasukkan nama yang sudah ada:
class ExampleModel(models.Model):
_name = 'example.model'
_description = 'Cegah Nama Duplikat'
name = fields.Char(string='Nama', required=True)
@api.constrains('name')
def _check_unique_name(self):
for record in self:
existing = self.env['example.model'].search([('name', '=', record.name), ('id', '!=', record.id)])
if existing:
raise ValidationError('Nama sudah digunakan!')
Perbedaan @api.constrains
vs _sql_constraints
Kriteria | @api.constrains |
_sql_constraints |
---|---|---|
Proses Validasi | Dilakukan di Python | Dilakukan di Database |
Fleksibilitas | Sangat fleksibel, bisa validasi kompleks | Hanya mendukung UNIQUE, CHECK, dan NOT NULL |
Performa | Lebih lambat karena dijalankan di aplikasi | Lebih cepat karena langsung di database |
Error Handling | Bisa menampilkan pesan yang lebih spesifik | Pesan error terbatas |
Kesimpulan
- Gunakan
@api.constrains
jika validasi membutuhkan logika kompleks, seperti pengecekan nilai yang bergantung pada kondisi tertentu. - Gunakan
_sql_constraints
jika hanya perlu memastikan keunikan data atau validasi sederhana yang bisa dieksekusi oleh database. - Kombinasikan keduanya untuk hasil terbaik:
_sql_constraints
untuk validasi unik,@api.constrains
untuk validasi aturan bisnis yang lebih kompleks.
Dengan constraints yang tepat, kita bisa memastikan bahwa data dalam aplikasi Odoo tetap valid dan konsisten! 🎉