17 Mart 2017 Cuma

Merhabalar,
Bu yazıda Django'nun kendi user modelinden kalıtım alarak kendi user modelimizi oluşturmayı ve authentication modeli olarak oluşturduğumuz modeli göstermeyi basit bir şekilde anlatacağım. Bu yazıyı yazmamın sebebi gözlemlediğim kadarı ile insanlar user modeline extra fieldlar eklemek istediklerinde OneToOneField kullanarak extra bir model oluşturduklarını görmem. Bunu daha basit, temiz ve tavsiye edilen yöntem olan hali hazırda Django'da yazılmış AbstractUser sınıfından kalıtım alarak nasıl çözeriz hemen bahsedelim.

OneToOneField


OneToOneField bildiğiniz gibi iki modeli ilişkilendirmek için kullanıyoruz. ForeignKey'de 1'e n bir ilişki varken, örneğin bir(1) yazarın birden fazla(n) kitabı olabilir. OneToOneField'de ise 1'e 1 ilişki bulunmaktadır. OneToOneField'in bu durumda nasıl kullanıldığını örneklemek amacı ile stackoverflow.com'dan bu örneği aldım. Tam olarak demek istediğim haliyle kullanmış buradaki arkadaş. Ama biz bunu istemiyoruz. Biz istiyoruz ki siz en güzel ve temiz yöntemi kullanın.
from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    nim = models.CharField(max_length=10, blank=True)

    def __str__(self):
        return self.user.username
Örnekte gördüğümüz gibi arkadaş Django'nun var olan User modeline nim adında bir field daha eklemek istemiş. Bunun için ise Profile adında bir model oluşturmuş ve bunu Django User modeli ile OneToOneField ile bağlamış.

Custom Model


Şimdi aynı işlemi kalıtım alarak uygulayalım.
from django.contrib.auth.models import AbstractUser
from django.db import models

class Profile(AbstractUser):
    email = models.EmailField('email address', unique=True)
    nim = models.CharField(max_length=10, blank=True)

    def __str__(self):
        return self.username
Burada ben ekstradan email alanını tekil ve zorunlu hale getirdim. Bildiğiniz gibi default user modelinde bu alan tekil ve zorunlu değil. Son olarak yapmamız gereken ise settings.py dosyası içerisinde bu modelin authentication modeli olduğunu Django'ya bildirmek.
AUTH_USER_MODEL = 'app_name.Profile'
Bu işlemden sonra Django'nun sadece bizim oluşturduğumuz modele ait tabloyu veritabanında oluşturduğunu görebilirsiniz. Son olarak oluşturduğumuz modeli admin sayfasında görebilmek için register işlemini yapalım.
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import Profile


admin.site.register(Profile, UserAdmin)
Faydalı olması dileğiyle. Kolay gelsin.

0 yorum :

Yorum Gönder