Koneksi antara tabel ke table auth user di Django
Berikut adalah contoh mengkoneksikan suatu table ke table auth user di django.
from django.db import models
# Create your models here.
class Patient(models.Model):
patient_id = models.AutoField(primary_key=True)
patient_name = models.ForeignKey('auth.User', related_name='patients', on_delete=models.CASCADE)
age = models.IntegerField()
dob = models.DateField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
bpjs_number = models.CharField(max_length=100)
address = models.TextField()
phone_number = models.CharField(max_length=100)
email = models.EmailField()
local_id_number = models.CharField(max_length=100)
profile_picture = models.ImageField(upload_to='patients/', null=True, blank=True)
class Meta:
db_table = 'patient'
verbose_name_plural = 'Patients'
def __str__(self):
return self.patient_name
Dalam Django, ketika Anda ingin membuat ForeignKey ke model User bawaan Django, Anda biasanya akan merujuk ke model tersebut menggunakan 'auth.User' jika Anda belum melakukan kustomisasi model User. Penulisan 'auth.User' adalah benar dan valid, karena auth adalah nama aplikasi Django dimana model User didefinisikan, dan User adalah nama kelas model tersebut.
Penjelasan
'auth.User': Ini adalah cara standar untuk merujuk ke model User bawaan Django yang berada di dalam aplikasiauth. Cara ini menjamin bahwa Anda merujuk ke model User yang tepat yang Django sediakan.'User'saja: Jika Anda hanya menggunakan'User', Django tidak akan tahu model apa yang Anda maksud kecuali Anda telah melakukan import model User di bagian atas file model Anda, yang umumnya bukan praktik yang disarankan karena dapat menyebabkan masalah ketergantungan dan kesulitan dalam memigrasi.
Penggunaan yang Lebih Baik
Sebagai alternatif yang lebih baik dan lebih fleksibel, Django menyarankan menggunakan fungsi get_user_model() untuk mendapatkan model User yang aktif. Ini sangat berguna jika Anda nantinya memutuskan untuk mengganti model User bawaan dengan custom user model.
Untuk menggunakan get_user_model(), Anda harus mengimpor dan menggunakannya di dalam fungsi atau metode (tidak di level kelas karena model belum siap saat Django mulai):
from django.contrib.auth import get_user_model
from django.db import models
class Patient(models.Model):
patient_id = models.AutoField(primary_key=True)
patient_name = models.ForeignKey(get_user_model(), related_name='patients', on_delete=models.CASCADE)
# other fields
class Meta:
db_table = 'patient'
verbose_name_plural = 'Patients'
def __str__(self):
return self.patient_name.username # Assuming patient_name is a User instance
Perhatikan perubahan dalam __str__ di mana saya menggunakan self.patient_name.username. Ini karena self.patient_name sekarang adalah instance dari User, dan kita biasanya ingin mengembalikan representasi string yang lebih berguna seperti username.
Kesimpulan
Penggunaan 'auth.User' dalam ForeignKey Anda benar dan akan bekerja tanpa masalah. Namun, jika Anda merencanakan atau sudah menggunakan custom user model, lebih baik menggunakan get_user_model() untuk menjaga agar kode Anda tetap fleksibel dan kompatibel dengan perubahan model User di masa depan.
Penggunaan related_name='patients' dalam deklarasi ForeignKey di Django sangat penting karena memberikan cara untuk mengakses objek yang berhubungan dari sisi model yang terhubung. Dalam konteks model Patient yang Anda berikan, related_name digunakan pada ForeignKey yang menghubungkan Patient ke model User bawaan Django.
Fungsi related_name='patients'
- Akses Terbalik (Reverse Access):
related_namememberikan nama untuk hubungan terbalik dariUserkePatient. Tanparelated_name, Django secara default menggunakan nama model yang terkait diikuti dengan_set(misalnya,patient_set) untuk menciptakan hubungan terbalik.- Dengan menetapkan
related_name='patients', Anda memudahkan untuk membaca dan menulis kode dengan menyediakan cara yang lebih intuitif dan deskriptif untuk mengakses semuaPatientyang terkait denganUsertertentu.
- Contoh Penggunaan dalam Query:
- Misalkan Anda memiliki instance
userdari modelUser. Jika Anda ingin mendapatkan semua objekPatientyang terkait denganusertersebut, Anda dapat melakukan query sebagai berikut:
- Misalkan Anda memiliki instance
user_patients = user.patients.all()
- Di sini,
patientsadalahrelated_nameyang Anda definisikan, danall()adalah metode untuk mendapatkan semua instancePatientyang terkait denganusertersebut.
Menghindari Konflik Nama:
related_namejuga berguna untuk menghindari konflik nama, terutama jika modelUserterkait dengan lebih dari satu model lain melalui ForeignKey. Misalnya, jikaUserjuga terhubung ke modelAppointmentmelalui ForeignKey lain, menetapkanrelated_nameyang berbeda untuk setiap hubungan membantu membedakan antara kumpulan objek yang berbeda.
Meningkatkan Keterbacaan Kode:
- Dengan menggunakan
related_nameyang deskriptif, Anda membuat basis kode Anda lebih mudah dibaca dan dipahami oleh pengembang lain atau bahkan oleh Anda di masa mendatang. Ini membantu menjelaskan hubungan antara model tanpa harus melihat definisi model.
Kesimpulan
related_name adalah fitur yang sangat berguna dan sering kali penting dalam Django ORM. Dengan memanfaatkannya, Anda dapat meningkatkan kejelasan dan efisiensi kode Anda saat bekerja dengan hubungan model yang kompleks. Selain itu, penggunaan related_name yang tepat sangat membantu dalam memelihara dan mengembangkan aplikasi Django yang besar atau yang terus berkembang.