Belajar Django 3.1 Mengenal Models (Bagian 3)
Belajar Django 3.1 Mengenal Models (Bagian 3)

Sekarang dibagian ke tiga dari seri tutorial belajar django 3.1, kita akan mengenal tentang models. Saya pernah membahas sedikit tentang membuat models.py, ini diperlukan untuk membuat website yang dinamis. Models sub kelas (subclass) dari django.db.models yang merepresentasikan tabel database, satu class mewakili satu tabel dan berisi behaviors atau perilaku bagaimana data itu dikelola. Dan setiap attribut model, mewakili satu bidang atau field database.

Daftar Isi

 

Dalam membuat website menggunakan django framework, models.py ini file yang berhubungan langsung dengan database. Dengan ini, sangat membantu dalam pengembangan website. Karena dengan kode minimal, kita sudah bisa membuat program CRUD lebih cepat.

Bagaimana tidak lebih cepat, karena cukup dengan membuat class yang nantinya nama class ini adalah nama tabelnya, lalu membuat attribute yang merupakan field dari tabel tersebut. Dalam kasusu tertentu, kita juga bisa menambahkan method untuk menambah kemudahan dalam mengolah data dari tabel database.

Satu pekerjaan yang mungkin sebagian teman-teman semua, kesulitan membuat syntax atau query database. Di Django, kita tidak menulis itu semua, sudah ada dan tinggal menggunakan saja.

Membuat models.py

Mungkin untuk yang pertama kali mengenal django framework, masih belum kebayang bagai mana menggunakannya, mari kita lihat salah satu contoh models.py

from django.db import models

# Create your models here.
class Artikel(models.Model):
    judul = models.CharField(max_length=100)
    isi = models.TextField()
    kategori = models.CharField(max_length=40)

    def __str__(self):
        return self.judul

Keterangan:

  1. Baris pertama tentu saja kita import dulu models dari django.db, sudah disebutkan sebelumnya ini merupakan subclass dari models.
  2. Selanjutnya membuat class dengan keyword class dan dicontoh ini saya memberi nama Artikel. Nama class dimulai dengan kapital besar. Dan kita menambahkan parameter models.Model yang artinya ini kita menginherit atau mewarisi atau mengambil semua properti dan method dari class Model.

    class Artikel ini mewakili tabel yang bernama blog_artikel pada database, blog nama app dimana models.py itu berada dan artikel nama class Artikel. Kalau membuat models.py pada app bernama staff dan classnya itu bernama Pegawai, maka tabelnya bernama staff_pegawai.

  3. Sekarang kita punya attribut judul, isi, dan kategori. Atribut tersebut mewakili field database. Dan memiliki tipe berbeda.

    Pada judul dan kategori menggunakan tipe CharField, yang itu adalah VARCHAR, untuk isi dengan type TextField yang pada database itu Long Text. Judul dan isi memiliki field option max_length masing-masing 100 dan 40, ini adalah batas maksimum yang bisa disimpan.

    Untuk lebih lengkapnya akan kita bahas pada tulisan terpisah tentang Field Option dan Field Type.

  4. Yang terakhir ada method def __str__(self):, ini adalah representasi string dari objek. Teman-teman bisa memilih field mana saja untuk mewakilinya, dan contoh ini dipilih judul untuk mewakilinya.

Untuk pertama kali membuat models

Pada models yang baru dibuat, tabelnya tentu saja belum ada pada database. Maka ini kita tidak bisa menggunakannya, maka selanjutnya setelah membuat models satu atau banyak, kita menjalankan perintah makemigrations dan migrate untuk menulis tabel berdasarkan models yang sudah dibuat.

Perintah ini dijalankan melalui terminal/cmd, pastikan berada pada virtual environment yang tepat dan sudah diaktifkan. Dan berada pada satu lokasi dengan file manage.py supaya mudah menjalankan perintahnya.


python manage.py makemigrations

Pertama kita lakukan perintah makemigrations terlebih dahulu, untuk memeriksa peribahan apa saja yang terjadi pada file models.py. Jika tidak ada perubahan

belajar django makemigrations

maka tidak perlu melakukan migrate, kalau seperti gambar di bawah ini maka setelah menjalankan perintah makemigrations, maka jalankan juga perintah migrate untuk menulis perubahan yang terjadi pada models ke database.

makemigrations belajar django


python manage.py migrate

belajar django migrate

Penulisan data tabel berdasarkan pada file yang berada di blog/migrations/0001_initial_py. File tersebut akan bertamabah sesuai dengan berapa kali kita membuat perubahan dan menjalankan perintah makemigrations, maksimum sampai 1000 x makemigrations. (saya belum mengetahui apakah setelah lebih dari 1000x makemigrations masih bisa lagi atau tidak, karena belum pernah melakukan perubahan sampai 1000xlaugh).

Django Models ORM

Web framework djago, sudah menyediakan secara default object-relational mapping layer, ini bisa kita gunakan untuk berinteraksi dengan berbagai macam relational database seperti SQLite, PostgreSQL, dan MySQL.

Django ORM adalah implementasi dari konsep pemetaan relasional objek (Object Relational Mapping (ORM)).

Buat sebagian orang, implementasi ini dianggap luar biasa karena dapat meningkatkan kecepatan dalam membangun website. Karena dengan adanya Django ORM, pengembang website tidak harus menulis kode SQL apa pun. Semuanya diotomatisasi, jadi ORM ini mengotomatisasi tansmisi pengiriman data antara database dengan model aplikasi. Tapi juga, ada yang tidak menyukai ORM. Di sini kita akan belajar tentang QuerySet yang paling dasar saja terlebih dahulu.

Seperti namanya ORM, yaitu memetakan atribut objek ke bidang (field) tabel masing-masing, begitu juga dengan mengambil data. Kalau kita membuat tabel MySQL dengan menggunakan syntax:


CREATE TABLE Artikel(
    id int AUTO_INCREMENT PRIMARY KEY,
    judul varchar(100) NOT NULL,
    isi text NOT NULL,
    kategori varchar(50) NOT NULL,
)

Maka pada django, kita tinggal menuliskan seperti yang sudah ada contoh di atas pada cara membuat models.

Membuat web site menggunakan web framework django, tidak begitu dibutuhkan pengetahuan dan keterampilan SQL tapi kalau memiliki itu akan lebih baik lagi. Karena sebenarnya database ini merupakan komponen yang penting, maka pengembang web pada masa lalu itu membuat ORMnya sendiri untuk interpretasi data. Mereka membuat class untuk struktur data yang digunakan dalam aplikasi web dan kemudian skema database yang sama juga dibut pada database.

Sementara itu, mengetahui implementasi SQL juga belum cukup karena sedikit perbedaan satu sama lainnya. Dan ini menjadikan tugas yang sulit dalam pengembangan web dan memakan waktu. Konsem ORM datang untuk mengatasi hal ini yang diperkenalkan dalam sebuah web framework.

Karena seperti yang disebutkan sebelumnya, ORM membuat otomatis skema database dari class model yang sudah ditentukan. SQL dihasilkan dari kode python untuk database tertentu. Jadi dengan ORM, kita memungkinkan untuk mebangun suatu proyek dengan satu bahasa pemrograman python.

QuerySet

Untuk mengambil data dari database kita menggunakan query, dan QuerySet adalah cara django untuk mengambil data dari database. Django ORM mengijinkan kita untuk menggunakan QuerySet.

QuerySet yang dimaksud ini adalah berisi daftar objek model, kita bisa menggunakan QuerySet untuk memfilter dan mengatur data. Dan dengan ini membuat pekerjaan sebagai web programmer python menjadi lebih mudah.

Akses ORM Di Shell

Kita bisa mengakses ORM dengan masuk ke mode InteractiveConsole, caranya dengan menggunakan perintah python manage.py shell. Yang sebelum itu, tentu saja sudah mengaktifkan virtual environment proyek Django. Maka tampilannya seperti ini.

GAMBAR SHELL

Kalau sudah masuk ke console seperti ini, kita bisa melakukan banyak hal. Dan untuk bisa mengakses model, maka kita import terlebih dahulu from blog.models import * untuk mengimport semua models yang ada. Atau, bisa juga mengimport models tertentu seperti from blog.models import Artikel.

blog adalah nama app, models adalah file models.py yang didalam app tersebut, dan Artikel adalah nama class models.

Ok, setelah berhasil mengimport modelnya, selanjutnya terserah Anda. Bisa melakukan CURD, misalkan:


# mengambil daftar dari semua data pada Artikel
Artikel.objects.all()

# mengambil data berdasarkan ID tertentu dengan filter
Artikel.objects.filter(id=2)

# mengambil list data dengan mengurutkan berdasarkan id
Artikel.objects.order_by('-id')

# menyimpan QuerySet ke dalam variabel
SemuaData = Artikel.objects.all()

# untuk menampilkan list
SemuaData

# mengambil single object dengan get
Artikel.objects.get(id=4)

# menambah record baru
Artikel.objects.create(judul="Membuat Record Dengan ORM", isi="Tulis isi artikel disini", kategori="Python")

# mengubah record tertentu misalkan field judul
# field judul berada pada id=2
Artikel.objects.filter(id=2).update(judul="Judul Baru")

# menghapus data misalkan yang memiliki id=13
Artikel.objects.filter(id=2).delete()

# mengambil beberapa list, misal 3 baris
Artikel.objects.all()[3]

# mencari record pada field judul berdasarkan kata tertentu
Artikel.objects.filter(judul="Membuat Record Dengan ORM")

# pencarian seperti ini sifatnya case-sensitive atau
# membedakan huruf besar dan kecil.
# agar tidak mempedulikan huruf besar dan kecil maka
# menggunakan __iexact
Artikel.objects.filter(judul__iexact="membuat record dengan orm")

# melakukan pencarian pada field isi
# yang terdapat kata tertentu
# case-sensitive
Artikel.objects.filter(isi_contains="Kata yang Kicari")

# case-insensitive
Artikel.objects.filter(isi_contains="kata yang dicari")

Ok ini belum semua, nanti kedepannya akan ditambah sedikit-sedikit saat sudah memahami lebih jauh tentang Django Framework.

Relationalship Field

Kerangka kerja ini juga mendukung database relational, seperti yang sudah kita ketahui bersama ada Foreign Key, One To One, dan Many to Many. Ok, langsung saja kita lihat cara menggunakannya:

Foreign Key

from django.db import models

# Create your models here.
class Kategory(models.Model):
    nama = models.CharField(max_length=50)

class Artikel(models.Model):
    judul = models.CharField(max_length=100)
    isi = models.TextField()
    kategori = models.ForeignKey(Kategory, on_delete=models.CASCADE)

    def __str__(self):
        return self.judul

One to One & Foreign Key

class TempatDuduk(models.Model):
    nomor = models.IntegerField()

    def __str__(self):
        return " Kursi {} sudah dipesan".format(self.nomor)
    
class Film(models.Model):
    judul_film = models.CharField(max_length=100)
    layar = models.IntegerField()
    pukul = models.TimeField()

    def __str__(self):
        return self.judul_film

class Pelanggan(models.Model):
    nama = models.CharField(max_length=100)
    tiket = models.CharField(max_length=100, unique=True)
    kursi = models.OneToOneField(TempatDuduk, on_delete=models.CASCADE, primary_key=True)
    judul_film = models.ForeignKey(Film, on_delete=models.CASCADE)
    pesan_makan = models.BooleanField(default=False)

    def __str__(self):
        return "Nama : {} pesan kursi nomor {}, Tiket {}".format(self.nama, self.kursi.nomor, self.tiket)

Many to Many

class Penulis(models.Model):
    nama = models.CharField(max_length=50)

    def __str__(self):
        return self.nama

class Artikel(models.Model):
    judul = models.CharField(max_length=100)
    isi = models.TextField()
    kategori = models.ForeignKey(Kategory, on_delete=models.CASCADE)
    penulis = models.ManyToManyField(Penulis)

    def __str__(self):
        return self.judul

Tiga contoh menggunakan relationships models pada Django

Selanjutnya

Kita sudah mempelajari cara menggunakan models pada Django web Framework. Untuk selanjutnya kita akan belajar django tentang Field Options dan Field Types yang sering saya gunakan. Karena ada banyak

Kalau ada pertanyaan bisa disampaikan langsung melalui kontak yang ada di menu Kontak