Django, framework web Python favorit saya, kembali merilis versi terbarunya — Django 5.2 Dirilis! Rilis ini merupakan bagian dari siklus rilis reguler Django dan membawa sejumlah fitur baru yang menarik, selain itu Django 5.2 mengalami peningkatan performa, serta perbaikan bug penting.
Buat kamu yang sedang atau akan membangun aplikasi web menggunakan Django, ini saatnya untuk menyimak apa saja yang baru di versi 5.2! Kalau kamu baru berkenalan dengan Django, cek artikel berikut https://riespratama.com/django-framework-python-untuk-membuat-web-dengan-cepat/
1. Semua model diimport secara default dalam Django 5.2 shell
Kita tidak perlu mengimport tiap model untuk dapat menggunakannya dalam shell, yang berarti bahwa saat kamu membuka shell Django, semua model dari semua aplikasi di proyekmu langsung tersedia tanpa perlu di-import manual, praktis!
⚠️ Tapi, Tunggu Dulu — Apa maksudnya “shell”?
Biasanya kamu menjalankan:
$ python manage.py shell
Lalu di dalamnya kamu biasa mengetik:
>>> from myapp.models import MyModel
Karena secara default, shell biasa tidak mengimpor model secara otomatis. Jadi kamu harus meng-import satu per satu.
🆕 Apa yang Berubah?
Mulai Django 5.2, jika kamu menggunakan:
$ python manage.py shell
📌 Maka semua model dari semua aplikasi akan otomatis di-import dan langsung bisa digunakan!
Contoh:
>>> Book.objects.all()
>>> User.objects.get(username="admin")
Kamu tidak perlu lagi menulis:
>>> from books.models import Book
>>> from django.contrib.auth.models import User
🔍 Bagaimana Cara Django Tahu Model-nya?
Django memindai semua aplikasi terdaftar di INSTALLED_APPS
, lalu mengambil semua model yang didefinisikan, dan mengimpor mereka saat shell dimulai.
✅ Manfaat Fitur Ini
- ⚡ Lebih cepat eksplorasi data di shell
- 🧪 Praktis untuk testing, debugging, dan eksperimen cepat
- 💬 Menyederhanakan workflow saat bekerja di development
📌 Catatan Tambahan
Sebelum Django 5.2, cara ini hanya tersedia lewat shell_plus
dari library eksternal django-extensions
.
Sekarang, fitur itu sudah built-in langsung di Django, tanpa perlu install apa-apa lagi.
✨ Kesimpulan
Django 5.2 menghadirkan peningkatan produktivitas dengan mengimpor semua model secara otomatis saat masuk ke shell, jadi kamu bisa langsung bekerja tanpa setup tambahan.
2. Django 5.2 mendukung composite primary keys
⚠️ Apa itu Composite Primary Key?
Secara sederhana:
Composite primary key adalah gabungan dua atau lebih kolom dalam sebuah tabel database yang secara bersama-sama membentuk primary key.Contoh Konsep:
Bayangkan kamu punya model Enrollment yang mencatat siswa mengikuti mata kuliah:class Enrollment(models.Model): student = models.ForeignKey(Student, on_delete=models.CASCADE course = models.ForeignKey(Course, on_delete=models.CASCADE)
Secara logis, satu siswa hanya bisa ikut satu mata kuliah satu kali, jadi kombinasi student + course
harus unik, dan bisa dianggap sebagai primary key. Itulah composite primary key.
🆕 Apa yang Baru di Django 5.2?
Dulu, Django tidak mendukung composite primary key secara resmi. Para developer harus mengakali dengan:
- Gunakan field unik kombinasi (
unique_together
) - Atau pakai primary key manual dan override method ORM (yang cukup ribet)
❗ Sekarang, mulai Django 5.2, kamu bisa menggunakan class CompositePrimaryKey
untuk mendefinisikan primary key dari gabungan beberapa field.
🔧 Contoh Penggunaan di Django 5.2
from django.db import models
from django.db.models import CompositePrimaryKey
class Enrollment(models.Model):
student = models.ForeignKey("Student", on_delete=models.CASCADE)
course = models.ForeignKey("Course", on_delete=models.CASCADE)
class Meta:
constraints = [
CompositePrimaryKey("student", "course"),
]
Dengan begitu:
- Tidak ada
id
default - Django tahu bahwa kombinasi
student
dancourse
adalah primary key
✅ Manfaat Fitur Ini
- Menyederhanakan model untuk use case tertentu (misal: tabel relasi seperti join table)
- Lebih cocok dengan struktur tabel yang sudah ada di database lama (legacy DB)
- Menjaga integritas data tanpa perlu workaround
📌 Catatan
Fitur ini masih relatif baru, jadi:
- Beberapa bagian ORM bisa punya keterbatasan (misalnya:
.get()
atau.update()
mungkin perlu penyesuaian) - Migration akan berbeda karena tidak ada
id
otomatis - Belum semua third-party package siap dengan composite primary key
✨ Kesimpulan
Django 5.2 membuka pintu untuk model data yang lebih kompleks dan realistis dengan mendukung composite primary keys secara native lewat
CompositePrimaryKey
.
Kalau kamu biasa bekerja dengan database relasional yang ketat atau sistem legacy, ini bisa menghemat banyak waktu dan kode ekstra.
3. Override BoundField sekarang lebih mudah di Django 5.2
⚠️ Apa itu BoundField
?
Di Django forms, setiap field yang sudah "terikat" ke data dan form disebut BoundField
. Ini adalah objek yang dipakai saat kamu menulis di template:
{{ form.username }}
{{ form.email.label }}
{{ form.password.errors }}
Setiap elemen {{ form.field_name }}
itu sebenarnya adalah objek BoundField
, bukan field aslinya (CharField
, EmailField
, dll.).
🔧 Apa Maksud “Overriding a BoundField” di Django 5.2?
Kadang kamu ingin mengubah perilaku BoundField, misalnya:
- Tambahkan class CSS khusus
- Ubah cara label dirender
- Tambahkan ikon atau wrapper di sekitar field
- Atau ubah method seperti
as_widget()
ataulabel_tag()
Sebelumnya, overriding BoundField cukup sulit, kamu harus membuat custom subclass BoundField
, lalu secara manual ganti cara form dirender.
🆕 Apa yang Baru di Django 5.2?
Mulai Django 5.2, cara override BoundField jadi lebih fleksibel dan mudah. Kamu sekarang bisa menentukan custom BoundField di tiga level berbeda:
1. Level Form
Override hanya berlaku untuk satu form saja:
class MyBoundField(BoundField):
def label_tag(self, contents=None, attrs=None, label_suffix=None):
return super().label_tag(contents=f"🔒 {self.name}")
class MyForm(forms.Form):
field = forms.CharField()
default_bound_field_class = MyBoundField
2. Level Field
Berlaku untuk satu field saja:
class MyCharField(forms.CharField):
bound_field_class = MyBoundField
3. Level Proyek (Global)
Berlaku untuk semua field di semua form dalam satu project. Cukup set di settings.py
:
FORM_DEFAULT_BOUND_FIELD = 'myapp.forms.MyBoundField'
✅ Manfaat Utama
- Mudah menyesuaikan tampilan dan perilaku field di form HTML
- Tidak perlu override
Form.render()
secara manual - Bisa buat tampilan field lebih konsisten di seluruh proyek (misalnya: untuk dark mode, framework CSS, dsb.)
✨ Kesimpulan
Sekarang kamu bisa mengubah cara Django merender setiap field di form dengan cara yang lebih sederhana dan terstruktur, langsung dari level form, field, atau global project.
Ini sangat bermanfaat kalau kamu ingin custom UI/UX form, integrasi dengan Tailwind, Bootstrap, atau sistem desain buatanmu sendiri.
Lebih jauh tentang Django 5.2 bisa ditemukan di dokumentasi resmi di : https://docs.djangoproject.com/en/5.2/