openSOURCE

openSOURCE

Did You Know?

All your business on one platform

Odoo Dev FAQs

Python — backend & ORM

Estimated reading: 5 minutes 36 views
Selamat datang di bagian pertama FAQ OdooCamp yang membahas Python — backend & ORM. Prolog ini menjadi pengantar sebelum kita masuk ke pertanyaan‑pertanyaan teknis yang paling sering diajukan oleh developer. Tujuan kita: menyamakan mindset, ruang lingkup, dan prinsip kerja yang akan dipakai di seluruh jawaban FAQ Python.

Mengapa Python Penting di Odoo?

Di Odoo, Python adalah tempat kita menulis logika bisnis, mendefinisikan model & field, mengatur constraint & compute, menjalankan wizards, cron, serta membuat controller untuk integrasi. ORM Odoo memberi kita antarmuka berorientasi objek untuk CRUD, relasi, dan query tanpa perlu SQL mentah dalam kebanyakan kasus.

Mindset Kerja yang Kita Pakai

Data → Model → Recordset → Environment (env) → Method
  • Model: kelas turunan models.Model/TransientModel/AbstractModel.
  • Recordset: sekumpulan record (bisa kosong/satu/banyak) yang mengeksekusi method secara vektor (batch‑friendly).
  • Environment (env): akses ke registry, cursor DB (env.cr), user (env.user), company (env.company), context (env.context).
  • Method: create, write, unlink, copy, method bisnis kustom, decorator @api.* untuk perilaku khusus.

Ruang Lingkup yang Akan Kita Bahas di FAQ Python

  1. Definisi model & field: tipe field, atribut umum, default, compute/inverse, relasi M2O/O2M/M2M.
  2. Decorator ORM: @api.model, @api.depends, @api.depends_context, @api.constrains, @api.onchange, @api.model_create_multi.
  3. CRUD & Query: search, browse, create, write, unlink, read, read_group, domain, context, prefetch.
  4. Business logic: method kustom, pola service/utility, reuse antar modul.
  5. Constraint & Validation: SQL constraint, Python constraint, skenario error → ValidationError, UserError.
  6. Compute & Onchange: kapan pakai compute vs onchange, store=True, depends yang benar.
  7. Keamanan: hak akses (ACL), record rule, sudo(), with_user(), with_company(), dan efeknya.
  8. Kinerja: batch‑friendly code, hindari N+1, gunakan mapped()/filtered(), read_group, indeks, dan caching ORM.
  9. Transaksi & Konsistensi: perilaku commit/rollback, proses panjang, kron, idempoten.
  10. Wizards & Cron: TransientModel, alur aksi pengguna, tugas terjadwal.
  11. Controller: http.Controller untuk portal/API sederhana (tanpa melanggar keamanan).
  12. Integrasi ringkas: pola aman memanggil model lintas modul.
Catatan: topik XML/QWeb/JS dibahas di bagian FAQ khususnya masing‑masing; di bagian ini kita fokus ke Python & ORM.

Prinsip Utama (Do/Don’t) yang Kita Pegang

Do
  • Gunakan ORM untuk CRUD & query; hanya pakai SQL mentah jika benar‑benar perlu.
  • Tulis method yang batch‑friendly (mampu memproses banyak record sekaligus).
  • Gunakan @api.model_create_multi untuk create massal, @api.depends yang tepat pada compute.
  • Validasi dengan constraint dan berikan pesan yang jelas (ValidationError).
  • Manfaatkan context (with_context) untuk perilaku kondisional (lokalisasi, default, flag fitur).
Don’t
  • Hindari sudo() sembarang; gunakan secukupnya, dan dokumentasikan alasannya.
  • Jangan menulis ke field computed tanpa inverse yang benar.
  • Jangan bergantung pada urutan eksekusi onchange untuk logika inti bisnis.
  • Jangan melakukan commit manual di business flow biasa; biarkan transaksi dikelola Odoo kecuali skenario khusus.

Anti‑Pola yang Sering Menjebak

  • N+1 Query: loop record yang memanggil search()/akses relasi per iterasi. Solusi: gunakan mapped/filtered, prefetch, atau satu query terpusat.
  • Compute tanpa depends yang lengkap: nilai tidak menyegarkan sesuai perubahan sumber. Pastikan semua field sumber tercantum.
  • Onchange memutakhirkan data persist: onchange semestinya untuk tampilan sementara; simpan ke DB di create/write.
  • sudo() di compute/constraint: dapat mengabaikan rule keamanan dan membuat hasil menipu. Tinjau kembali kebutuhan.

Kerangka Kode Minimal (Siap Mulai)

# models/my_model.py
from odoo import api, fields, models
from odoo.exceptions import ValidationError

class MyModel(models.Model):
    _name = "my.model"
    _description = "Contoh Model OdooCamp"

    name = fields.Char(required=True)
    amount = fields.Float(default=0.0)
    tax_ids = fields.Many2many("account.tax", string="Taxes")

    # field computed tersimpan
    total = fields.Monetary(currency_field="currency_id", compute="_compute_total", store=True)
    currency_id = fields.Many2one("res.currency", default=lambda self: self.env.company.currency_id.id)

    @api.depends("amount", "tax_ids")
    def _compute_total(self):
        for rec in self:
            tax_amount = sum(rec.tax_ids.mapped("amount")) / 100.0 * rec.amount if rec.tax_ids else 0.0
            rec.total = rec.amount + tax_amount

    @api.constrains("amount")
    def _check_amount(self):
        for rec in self:
            if rec.amount < 0:
                raise ValidationError("Amount tidak boleh negatif.")

    def action_confirm(self):
        # contoh method bisnis batch‑friendly
        for rec in self:
            # ... logika bisnis di sini
            pass
        return True

Checklist Sebelum Masuk ke FAQ Detail

  • Struktur model jelas, field terdefinisi rapi, dan penamaan konsisten.
  • Compute memiliki @api.depends yang lengkap; gunakan store=True hanya jika perlu performa/filtrasi.
  • Validasi terpasang (@api.constrains) untuk aturan yang tidak dapat dipercayakan ke UI.
  • Query hemat & batch‑friendly; hindari N+1.
  • Pertimbangkan keamanan (ACL & record rules) di setiap method yang dapat dipanggil pengguna.

Apa yang Akan Kita Jawab di FAQ Python

  • Perbedaan models.Model vs TransientModel vs AbstractModel.
  • Kapan pilih compute vs onchange, dan bagaimana menulis inverse.
  • Cara membuat domain dinamis dengan context.
  • Cara aman menggunakan sudo() dan kapan tidak menggunakannya.
  • Optimasi search, read_group, dan teknik anti N+1.
  • Pola penulisan create/write/unlink/copy yang benar.
  • Praktik terbaik untuk error handling & pesan validasi.
  • Pola hooks (pre_init_hook, post_init_hook, uninstall_hook).
Dengan prolog ini, kita siap melangkah ke pertanyaan‑pertanyaan inti di bagian Python — backend & ORM. Ayo lanjut ke FAQ dan bahas kasus nyata yang sering kita temui di proyek Odoo 18 CE.

Leave a Comment

Share this Doc

Python — backend & ORM

Or copy link

CONTENTS