Gunakan tanda [] untuk mencari tag gan! contoh [flutter, javascript]

Odoo - Model Api Constraint

Odoo - Model Api Constraint

Artikel ini dibukukan pada buku Odoo ERP Development
access_time 04 Feb 2025 remove_red_eye 86 Kali spellcheck 631 Kata, 4538 Karakter
#odoo #odoo model #constraint

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

  1. Decorator @api.constrains('age') → Fungsi _check_age hanya akan dijalankan jika field age berubah.
  2. Perulangan for record in self → Mengiterasi setiap record yang sedang diperiksa.
  3. Kondisi if record.age < 18 → Jika usia kurang dari 18, akan memunculkan error.
  4. 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 nilai code 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! 🎉

Artikel ini dibukukan pada buku Odoo ERP Development
Navigasi Konten