Thursday, November 05, 2009

Solusi composite primay key di Django

Mahalo, akhirnya setelah berkutat kesana kemari dengan ORM Django, akhirnya dapat juga solusi untuk mengatasi Composite Primary Key di Django. Django ORM menganut paham active_record, yang salah satu featurenya ada "1 kolom sebagai primary key" dalam suatu tabel. Persyaratan ini merupakan keharusan dalam sistem ORM Django.

Hal ini akan menimbulkan masalah pada saat kita akan memakai Django untuk sistem yang telah berjalan / legacy system, karena design tabel database di sistem tersebut banyak yang menggunakan composite key, atau lebih dari satu kolom sebagai primary key-nya.
Sebagai contoh kita ambil tabel kota, maka composite key nya adalah (kode_negara, kode_kota).

Nah solusi yang saya tawarkan adalah sebagai berikut :
  • buat satu kolom baru didalam tabel yang anda inginkan, dan jadikan kolom ini sebagai target untuk membuat primary key yang baru


    • alter table kota add column kota_id


  • kemudian di function save dari class model kota tersebut kita tambahkan perintah yang akan mengisi kolom kota_id dengan gabungan dari kolom kode_negara dan kode_kota


    • def save(self):
              if not self.kota_id:
                  self.kota_id = "%s%s" % (self.kode_negara, self.kode_kota)
                  super(Kota, self).save()



  • Kemudian pada saat save_edit, kita juga harus memastikan kolom primary key ini tidak ikut diubah oleh sistem.
Solusi yang saya tawarkan ini memang tidak 100% membuat saya puas, tetapi ini yang menurut saya terbaik saat ini. Dengan cara seperti ini, sistem yang sudah ada hanya perlu di ubah sedikit saja, tanpa merusak sistem yang lama.


No comments: