Szeto Consultants

Mohon Pencerahan: Cara Konversi ID (Integer) ke Display Name di Odoo

Mohon Pencerahan: Cara Konversi ID (Integer) ke Display Name di Odoo

Diposting pada 04 Jun 2026, 00:46
Ditanyakan oleh: Lestari

Halo teman-teman praktisi dan pengguna Odoo di sini,

Saya Lestari, dari tim IT di perusahaan. Saya lagi ada kendala sekaligus mau cari best practice nih terkait konversi data di Odoo.

Jadi gini, seringkali kan di Odoo itu, khususnya di custom report (misal pakai QWeb) atau bahkan di custom module yang kita buat, data yang kita ambil dari database atau object lain itu berupa ID (integer). Contohnya, untuk field 'customer_id' atau 'product_id', yang tersimpan cuma angka ID-nya saja.

Nah, masalahnya, user kita atau stakeholder lain butuhnya itu 'display name' yang human-readable, bukan ID-nya. Misalnya dari 'customer_id: 123' jadi 'PT Sejahtera Abadi' atau 'product_id: 456' jadi 'Laptop Seri X Pro'.

Saya butuh panduan atau sharing pengalaman dari teman-teman, bagaimana cara paling efektif dan efisien untuk melakukan konversi ID (int) ini menjadi display name-nya?

Apakah cukup dengan method seperti `env['model_name'].browse(record_id).display_name` di Python/controller? Atau ada cara yang lebih elegant dan performant kalau datanya melibatkan banyak record, terutama jika diterapkan di laporan QWeb atau di dalam logic view?

Mungkin ada tips atau trik lain, misalnya menggunakan computed field atau ada helper method khusus yang biasa teman-teman pakai? Mohon pencerahannya ya, karena ini sering jadi PR kalau mau bikin report yang user-friendly.

Terima kasih banyak atas waktu dan bantuannya!

Balasan (1)

Admin Odoo ForumAdmin & AI Support04 Jun 2026, 00:46
Halo Kak Lestari! Wah, ini pertanyaan yang sering banget muncul dan memang jadi PR utama kalau kita main-main sama custom report atau custom module di Odoo. Makasih banyak sudah sharing kendalanya di sini, biar kita bisa diskusi dan cari solusi terbaiknya.

Oke, Kak Lestari sudah on track banget dengan `env['model_name'].browse(record_id).display_name`. Itu memang salah satu cara yang paling sering dipakai dan valid untuk mendapatkan display name dari sebuah ID. Tapi, mari kita bedah lebih lanjut biar lebih efektif dan performant, terutama untuk skenario yang melibatkan banyak data atau di QWeb.



### 1. Cara Paling Odoo-Native dan Efisien: Manfaatkan Tipe Field `Many2one`

Ini adalah best practice yang paling utama di Odoo. Kalau Kak Lestari membuat custom field atau memilih field yang memang sudah ada, dan field itu mengacu ke model lain (misalnya `partner_id` ke `res.partner`, `product_id` ke `product.product`), pastikan tipe field-nya adalah Many2one.

Dengan field `Many2one`, Odoo sudah secara otomatis menyediakan objek (recordset) dari model terkait. Jadi, kalau Kak Lestari punya `order.partner_id`, Kak Lestari bisa langsung akses:
`order.partner_id.name` untuk nama partner (kalau ada field `name` di model target).
`order.partner_id.display_name` untuk display name yang lebih lengkap (ini biasanya sudah disiapkan Odoo untuk banyak model).

Kenapa ini efisien? Karena Odoo ORM sudah punya mekanisme caching yang pintar. Saat Kak Lestari mengakses `order.partner_id`, Odoo akan mencoba mengambil data partner tersebut (kalau belum ada di cache) dan menyimpannya. Akses berikutnya akan sangat cepat. Ini jauh lebih baik daripada harus `browse()` satu per satu dari ID jika field-nya hanya menyimpan integer biasa.



### 2. Di Python/Controller/Computed Field: `browse()` Itu Teman Kita

Untuk skenario di mana Kak Lestari memang hanya punya ID (misalnya dari hasil query database langsung, atau dari field yang memang sengaja menyimpan ID integer), maka `env['model_name'].browse(record_id).display_name` adalah cara yang tepat.

Contoh:
```python
# Misalkan 'product_id_integer' adalah field di custom module Kak Lestari yang cuma nyimpan ID integer
# Atau dari parameter di controller
product_id = self.product_id_integer
product_record = self.env['product.product'].browse(product_id)
product_name = product_record.display_name
```

Kalau Kak Lestari punya banyak ID (list of IDs), bisa langsung di-browse semua sekaligus:
```python
list_of_product_ids = [1, 5, 10, 15] # Contoh list ID
product_records = self.env['product.product'].browse(list_of_product_ids)
for product in product_records:
print(f"ID: {product.id}, Name: {product.display_name}")
```
Ini lebih performant karena Odoo ORM bisa mengoptimalkan query ke database untuk mengambil data banyak ID sekaligus.



### 3. Di Laporan QWeb: Hati-hati dengan Logika Kompleks

Nah, ini bagian yang tricky di QWeb.

Jika field-nya Many2one:
Ini yang paling ideal. Kak Lestari bisa langsung pakai:
```xml

```
atau bahkan seringkali cukup:
```xml

```
Karena Odoo QWeb biasanya sudah pintar untuk merender `display_name` dari objek Many2one secara default.

Jika Kak Lestari hanya punya ID (integer) di QWeb:
Ini yang kurang direkomendasikan untuk data banyak. Tapi jika terpaksa, bisa seperti ini:
```xml


```
Peringatan: Melakukan `browse()` di dalam loop QWeb untuk setiap record bisa sangat memperlambat performa laporan jika datanya banyak.

Solusi Terbaik untuk QWeb (Data Banyak):
Sebaiknya, siapkan data yang sudah "matang" di bagian Python (biasanya di report model atau wizard yang memicu report) sebelum dikirim ke template QWeb.
Misalnya, Kak Lestari bisa membuat method di report model yang mengembalikan dictionary atau list of dicts yang sudah berisi `display_name`-nya.

```python
# Contoh di models.py untuk custom report
from odoo import models, api

class MyCustomReport(models.AbstractModel):
_name = 'report.my_module.report_my_custom_template'

@api.model
def _get_report_values(self, docids, data=None):
docs = self.env['my.model'].browse(docids)
processed_data = []
for doc in docs:
customer_name = doc.customer_id.display_name # Jika customer_id adalah Many2one
# Atau jika hanya punya ID integer:
# customer_name = self.env['res.partner'].browse(doc.customer_id_integer_field).display_name

processed_data.append({
'id': doc.id,
'name': doc.name,
'customer_name': customer_name,
# ... data lain yang dibutuhkan
})
return {
'doc_ids': docids,
'doc_model': 'my.model',
'docs': processed_data, # Kirim data yang sudah di-process ke QWeb
}
```
Dengan begitu, di QWeb Kak Lestari tinggal panggil `t-esc="doc.customer_name"`, yang jauh lebih cepat karena datanya sudah disiapkan.



### 4. Computed Field: Solusi Elegan untuk Reusabilitas

Kalau Kak Lestari sering butuh display name ini dan tidak ingin repot `browse()` terus-menerus, membuat computed field bisa jadi pilihan yang sangat elegan.

Contoh:
Misalkan di `sale.order` Kak Lestari mau menyimpan nama produk dari `order_line` pertama, tapi cuma punya `product_id` (integer) di suatu tempat.
```python
from odoo import fields, models, api

class SaleOrder(models.Model):
_inherit = 'sale.order'

# Jika 'first_product_id_int' adalah field integer yang menyimpan ID produk
first_product_display_name = fields.Char(
string='First Product Name',
compute='_compute_first_product_display_name',
store=True, # Kalau mau disimpan di database biar cepat
)

@api.depends('order_line.product_id') # Atau 'first_product_id_int'
def _compute_first_product_display_name(self):
for record in self:
if record.first_product_id_int:
product_record = self.env['product.product'].browse(record.first_product_id_int)
record.first_product_display_name = product_record.display_name
else:
record.first_product_display_name = False
```
Dengan computed field ini, Kak Lestari bisa langsung pakai `sale_order.first_product_display_name` di mana pun (view, report, controller) tanpa perlu `browse()` lagi. Tambahan `store=True` akan menyimpan nilainya di database, sehingga tidak perlu dihitung ulang setiap kali diakses (tapi akan di-recompute jika dependensinya berubah).



Singkatnya, Kak Lestari:
Prioritaskan penggunaan Many2one field. Ini yang paling Odoo-native, efisien, dan bersih.
Untuk ID yang terpisah, `env['model_name'].browse(id).display_name` itu valid. Gunakan `browse(list_of_ids)` untuk data banyak agar lebih performant.
Di QWeb, siapkan data di Python report model agar QWeb hanya tugasnya menampilkan data yang sudah jadi. Hindari `browse()` di dalam loop QWeb.
Pertimbangkan computed field untuk data yang sering diakses dan perlu tampilannya langsung.

Semoga pencerahan ini membantu Kak Lestari dalam membuat custom report yang lebih user-friendly dan performant ya! Kalau ada pertanyaan lanjutan atau mau diskusi contoh spesifik, jangan sungkan tanya lagi! Sukses selalu!

Berikan Tanggapan

⚠️ Anti-Spam Aktif: Dilarang menyertakan tautan/URL di dalam form ini.
Butuh Konsultasi Odoo? 👋
Scroll to Top