Django Model – Models Update

Pada modul akan dibahas modifikasi model dengan menambahkan kolom atau attribute. Perubahan ini akan diupdate ke database melalui proses migrasi.

Perlu diperhatikan, ketika melakukan penambahan field baru, akan diperlukan default value untuk field tersebut. Hal ini terjadi karena untuk data yang sudah ada sebelumnya, django perlu mengetahui, value apa yang akan digunakan. Anda bisa menggunakan default value null.

Jika default value tidak ditambahkan, pada saat proses migrasi, django akan meminta kita melakukan pengisian default value tersebut.

Berikut contoh ketika default value untuk field “heartrate” tidak didefinisikan pada models.py.

$ python manage.py makemigrations boffice
It is impossible to add a non-nullable field 'heartrate' to patient without specifying a default. This is because the database needs something to populate existing rows.
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit and manually define a default value in models.py.
Select an option:

Anda bisa melanjutkan proses migrasi dan memilih default value, atau membatalkan migrasi dan perbaiki models dengan menambahkan default value.

Disarankan untuk melakukan penambahan default value dahulu sebelum melakukan migrasi.

Pada modul ini juga kita akan pelajari penggunaan validator untuk melakukan validasi terhadap entry.

Untuk skenario perubahan, kita akan tambahkan field baru , yaitu heartrate. Disini juga kita akan tambahkan validator, dimana heartrate dan age harus memiliki range tertentu.

Untuk kebutuhan validasi diatas, kita perlu import library baru, yaitu : MaxValueValidator, MinValueValidator dari django.core.validators.

Untuk dokumentasi lengkap django validator lihat di https://docs.djangoproject.com/en/4.0/ref/validators/

Buka file boffice/models.py, kita lakukan modifikasi seperti berikut. (Penjelasan code lihat comment)

from django.db import models
#library untuk validators
from django.core.validators import MaxValueValidator, MinValueValidator

class Patient(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

    #modifikasi age untuk ditambahkan validasi, umur harus dalam range 1 - 130
    age = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(130)])

    #field baru, perlu default value, digunakan 60, dengan validasi value dalam range 1 - 300
    heartrate = models.IntegerField(default=60, validators=[MinValueValidator(1), MaxValueValidator(300)])
    
    #jika default adalah null, gunakan parameter null = True
    #heartrate = models.IntegerField(null=True)

    def __str__(self):
        return f"{self.first_name} {self.last_name}, umur: {self.age} tahun."

Setelah modifikasi disimpan, kita lakukan migrasi, buka command prompt, lalu jalankan perintah

$ python manage.py makemigrations boffice

Log akan menampilkan perubahan telah berhasil, yaitu penambahan field heartrate dan perubahan pada field age.

Migrations for 'boffice':
  boffice\migrations\0002_patient_heartrate_alter_patient_age.py
    - Add field heartrate to patient
    - Alter field age on patient

Django juga akan membuat file migration baru, pada tutorial, digenerate file migrasi 0002_patient_heartrate_alter_patient_age.py

Terakhir untuk mengupdate perubahan kedalam databse gunakan perintah

$ python manage.py migrate       

Log apply migrations kurang lebih seperti ditampilkan berikut:

Operations to perform:
  Apply all migrations: admin, auth, boffice, contenttypes, sessions
Running migrations:
  Applying boffice.0002_patient_heartrate_alter_patient_age... OK

Sampai disini kita sudah mempelajari bagaimana melakukan modifikasi models dengan menambahkan field baru, modifikasi field lama, dan menambahkan validator.

Pada modul selanjutnya akan dibahas data updating.

Sharing is caring:

Leave a Comment