Membuat Module Odoo (Bagian 7 – Relational Field)

Pada Bagian 4 sudah kita bahas field Odoo yang bersifat sederhana atau bisa juga disebut primitive data type. Pada bagian ini kita akan membahas Relational Field.

Relational field adalah field yang nilainya berhubungan dengan tabel lain. Konsepnya sama dengan relasi antar tabel pada database. Dimana ada relasi one to many, many to one dan many to many. Sebagai contoh kasus, kita akan mengubah kode pada bagian 6. Bagian yang perlu menggunakan relational field akan kita ubah, sehingga bisa lebih terstruktur dan lebih baik. Berikut ini jenis-jenis relational field pada Odoo.

  1. Many2one

    Gunakan Many2one jika model yang kita buat tersambung dengan tepat satu data pada model/tabel lain. Misal pada bagian 6 kita memiliki field Nama Pelanggan. Karena pada satu form service hanya untuk satu pelanggan maka kita bisa menggunakan Many2one pada field ini. Lalu mau disambungkan ke model/tabel apa ? Perlukah kita membuat model pelanggan ?

    Odoo memiliki model res.partner. Yang digunakan untuk menyimpan data pelanggan atau supplier. Jadi kita tidak perlu membuat model pelanggan lagi. Kita akan mencoba memodifikasi model my.service agar nama pelanggan ambil dari model res.partner ini dengan field Many2one. Berikut ini kodenya.

    customer = fields.Many2one(string="Nama Pelanggan",comodel_name="res.partner",ondelete="restrict")
    

    Parameter comodel_name wajib anda isi. Isi dengan model yang ingin anda sambungkan dengan field anda. Sedangkan parameter ondelete tidak harus diisi. Anda bisa menggunakan pilihan set null, restrict atau cascade untuk parameter ondelete. Berikut ini tampilan field Nama Pelanggan yang terhubung dengan model res.parner.

    NOTE : anda tidak perlu mengubah view karena Odoo sudah bisa mendeteksi tampilan yang tepat walaupun tipe data sudah berubah.

  2. One2many

    Gunakan One2many jika model yang kita buat tersambung dengan banyak data pada model/tabel lain. Misal pada form service kita adalah field Nama Mesin. Karena satu pelanggan bisa saja service lebih dari satu mesin, maka akan lebih baik jika kita ubah field ini jadi One2many. Dan juga Serial Number Mesin seharusnya juga mengikat ke Nama Mesin, sehingga kita juga perlu mengubahnya. Lalu apakah perlu membuat model baru atau Odoo sudah punya model untuk kasus ini ?

    Sayangnya kita harus membuat model baru untuk ini, misal my.service.detail. Berikut ini kodenya.

    # -*- coding: utf-8 -*-
    from odoo import api, fields, models, exceptions, _
    import datetime
    
    
    class MyServiceDetail(models.Model):    
        _name = 'my.service.detail'
        _description = 'Service Detail'
    
        # kita sambungkan dengan master product agar tidak perlu ketih nama mesin secara manual
        device = fields.Many2one(string="Nama Mesin",comodel_name="product.product",ondelete="restrict")
        device_sn = fields.Char(string="Serial Number Mesin")
    
        # kita simpan biaya jasa per produk
        service_price = fields.Float(string="Biaya Jasa")
    
        # PENTING
        # agar bisa menggunakan One2many kita harus punya relasi Many2one
        service_id = fields.Many2one(string="Form Service",comodel_name="my.service",ondelete="cascade")
    
    
    
    
    class MyService(models.Model):    
        _name = 'my.service'
        _description = 'Service'
    
        # kode tambahan untuk relasi One2many
        # pastikan pada model terkait sudah dibuat relasi Many2one
        service_detail_ids = fields.One2many(string="Service Detail", comodel_name="my.service.detail", inverse_name="service_id")
    

    PENTING. Agar bisa menggunakan field One2many anda harus punya relasi Many2one pada model / tabel terkait, dan masukkan nama field tersebut sebagai isian inverse_name, jika tidak akan terjadi error. Anda juga perlu mengubah View karena ada field yang ditambah dan dihapus. Silakan download source code lewat link dibawah.

    Berikut ini tampilan field One2many pada form service.

  3. Many2many

    Gunakan Many2many jika kita memiliki model A yang tersambung dengan banyak data dengan model B dan juga model B bisa jadi tersambung dengan banyak data dengan model A. Hal ini mirip dengan One2many, bedanya jika One2many model B hanya tersambung dengan satu data model A. Contoh pada dunia nyata adalah hubungan antara artikel dengan tag.

    Pada kode dibawah ini kita akan ubah field type_of_service dari bertipe data Selection jadi Many2many. Tentu kita perlu menyiapkan model baru untuk ini.

    # model baru untuk tipe service
    class MyServiceType(models.Model):    
        _name = 'my.service.type'
        _description = 'Service Type'
    
        name = fields.Char(string="Service Type")
    
    
    class MyService(models.Model):    
        _name = 'my.service'
        _description = 'Service'
    
        # ubah type_of_service jadi Many2many
        type_of_service = fields.Many2many(
            string="Tipe Service", 
            comodel_name="my.service.type", 
            relation="my_service_my_service_type_rel",
            column1="service_id",
            column2="service_type_id")
    

    Parameter relation, column1 dan column2 tidak wajib diisi. Isi jika anda ingin menentukan nama tabel dan kolom yang dibuat dari field Many2many. Karena relasi Many2many akan membuat tabel baru sebagai jembatan. Berikut tampilan field Many2many.

Download Source Code

Tulisan Serupa

Leave a Reply

Your email address will not be published. Required fields are marked *