Birebir İlişki Kullanarak Django User Modeline Ekstra Alanlar Ekleme

Django Framework ünde gelen hazır model yapısında User modelinde eğer yeni alanlara ihtiyaç duyulursa bunu iki şekilde çözebiliriz.

Bunlardan biri AbstractBaseUser modelini extend etmek.

İkincisi yeni bir model oluşturup bunu birebir ilişki ile(OneToOne) User modeline bağlamak.

Bu yazıda ikinci yolu kullanarak User modeline ekstra alanlar nasıl sağlarız bunu anlatacağım.

User modelinde ihtiyaç duyacağımız ekstra alanlar Profile modelinde bulunacak. Profile modelimizde user ın telefon, adres, resim gibi bilgileri tutulacak. Veri tabanında her bir user oluşturulduğunda Profile modelinde User modeline birebir ilişki ile(OneToOne) bağlı kaydın oluşması gerekiyor.

Bunun için modellerimizin bulunduğu model.py dosyasında user_is_created() adında bir fonksiyon tanımlıyoruz.

User tablosunda oluşacak create aksiyonu olup olmadığını algılamak için post_save signalini kullanacağız.

Bunu için user_is_created()  fonksiyonumuzun üstüne @receiver decoratorü kullanarak gerçekleştireceğiz.

from django.db import models
from django.contrib.auth.models import User
from django.dispatch import receiver
from django.db.models.signals import post_save # Produce a signal if there is any database action.

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete= models.CASCADE )
    occupation = models.CharField(max_length=150, null=True, blank=True)
    phone = models.CharField(max_length=30, null=True, blank=True)
    address = models.CharField(max_length=250, null=True, blank=True)
    city = models.CharField(max_length=150, null=True, blank=True)
    country = models.CharField(max_length=150, null=True, blank=True)
    image = models.ImageField(upload_to='pictures/%Y/%m/%d/' , max_length=255, null=True, blank=True)

    def __str__(self):
        return "{0}".format(self.user.email)

# When any User instance created, Profile object instance is created automatically linked by User 
@receiver(post_save, sender = User)
def user_is_created(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user= instance)
    else:
        instance.profile.save()
Topluluk Tarafından Doğrulandı simgesi

DJANGO VERSİYON : 3.1.1

Topluluk Tarafından Doğrulandı simgesi