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_name
memberikan nama untuk hubungan terbalik dariUser
kePatient
. 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 semuaPatient
yang terkait denganUser
tertentu.
- Contoh Penggunaan dalam Query:
- Misalkan Anda memiliki instance
user
dari modelUser
. Jika Anda ingin mendapatkan semua objekPatient
yang terkait denganuser
tersebut, Anda dapat melakukan query sebagai berikut:
- Misalkan Anda memiliki instance
user_patients = user.patients.all()
- Di sini,
patients
adalahrelated_name
yang Anda definisikan, danall()
adalah metode untuk mendapatkan semua instancePatient
yang terkait denganuser
tersebut.
Menghindari Konflik Nama:
related_name
juga berguna untuk menghindari konflik nama, terutama jika modelUser
terkait dengan lebih dari satu model lain melalui ForeignKey. Misalnya, jikaUser
juga terhubung ke modelAppointment
melalui ForeignKey lain, menetapkanrelated_name
yang berbeda untuk setiap hubungan membantu membedakan antara kumpulan objek yang berbeda.
Meningkatkan Keterbacaan Kode:
- Dengan menggunakan
related_name
yang 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.