Skip to content

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 aplikasi auth. 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'

  1. Akses Terbalik (Reverse Access):
    • related_name memberikan nama untuk hubungan terbalik dari User ke Patient. Tanpa related_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 semua Patient yang terkait dengan User tertentu.
  2. Contoh Penggunaan dalam Query:
    • Misalkan Anda memiliki instance user dari model User. Jika Anda ingin mendapatkan semua objek Patient yang terkait dengan user tersebut, Anda dapat melakukan query sebagai berikut:
user_patients = user.patients.all()
  • Di sini, patients adalah related_name yang Anda definisikan, dan all() adalah metode untuk mendapatkan semua instance Patient yang terkait dengan user tersebut.

Menghindari Konflik Nama:

  • related_name juga berguna untuk menghindari konflik nama, terutama jika model User terkait dengan lebih dari satu model lain melalui ForeignKey. Misalnya, jika User juga terhubung ke model Appointment melalui ForeignKey lain, menetapkan related_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.

Leave a Reply

Your email address will not be published. Required fields are marked *