· Hakan Çelik · Django / Veritabanı · 3 dk okuma
Django Projesinde Birden Fazla Veri Tabanı Kullanımı

Django Projesinde Birden Fazla Veri Tabanı Kullanımı
Neler öğreneceğiz ?
- django ile birden fazla veri tabanı kullanımını
- django ile uygulama oluşturmayı
- ziyaretçilerin ip adreslerini bulmayı öğreneceğiz
- from django.db.models import F kullanımını öğreneceğiz.
Gerekenler
- python3
- django 1.11
- Virtualenv
Virtualenv için bilgiye ihtiyacınız varsa şu adresi inceliyebilirsiniz. Virtualenv
Yukarıda verdiğim adresten Virtualenv kurulumunu ve gerekli paketleri requirements’leri kurun.
[===========]
Neden birden fazla veri tabanı kullanımı yapayım diye soruyor iseniz size şöyle bir örnekle açıklayabirim, ben coogger.com ‘da içeriklerin okunma sayısını ziyaretçilerden gelen ip adresleri ilgili içeriğin id numarasi ile birlikte kayıt ediyorum ve kişi daha önceden okumuş ise yani şuan okuduğu içeriğin id numarası ve o kişinin ip adresi daha önceden kayıt edilmiş ise okuma sayısını 1 arttırmıyorum şimdi birde diğer veriler bu veri tabanına kayıt oluyor ve ip adresler bana çokta lazım değil diğer verilerin yanında örneğin kullanıcı bilgileri paylaşılan içerikler yararlı fakat ip adresler yararlı değil hemde çok fazla kayıt gerçekleşiyor işte bu iki yararlı ve yararsız verileri bir birinden ayırmak için birden fazla veri tabanı ayarladım şimdi bunu yapalım hep birlikte.
Öncelikle neye ihtiyacımız var ?
Şimdi sizin zaten bir tane django projeniz hali hazırda olması gerek içinde myapp olarak bir tane uygulamanız var diyelim settings.py dosyanızda ki veri tabanı ayarı kısmı şu şekildedir.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'sqlite3'),
},
}doğrumu doğru. şimdi myapp adındaki uygulama dizinize gelin ve yeni bir uygulama oluşturmak için konsolu açıp şunu yazın.
python3 manage.py startapp multiappşimdi yeni bir uygulamamız oluştu. Tekrar settings.py adresine gelin ve şöyle yapın.
INSTALLED_APPS = [
"multiapp",
"myapp",
.....
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'sqlite3'),
},
'multi': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'multidb'),
},
}
DATABASE_APPS_MAPPING = {'multiapp': 'multi'}oluşturduğumuz yeni uygulamamızı INSTALLED_APPS bölümüne ekledik ve ikinci veri tabanımızı ayarladık. DATABASE_APPS_MAPPING bu kısım hangi uygulamanın hangi veri tabanını kullanacagını seçmemizde bize yardımcı olacak.
multiapp/models.py adresine gidin ve ziyaratçilerden alacağımız ip adreslerin kaydı için bir model yazalım tıpkı şöyle.
from django.db import models
from myapp.models import Blog
class Blogviews(models.Model):
content = models.ForeignKey(Blog ,on_delete=models.CASCADE)
ip = models.GenericIPAddressField() # ve ip adres için olan alanımız
class Meta:
app_label = 'multiapp'myapp adındakı uygulamanızda blog adında bir modeliniz var foreignkey ile bunu blog modelinize bagladık app_label = ‘multiapp’ işte bu kısım ayarlarda ayarladıgımız DATABASE_APPS_MAPPING kısmında ki verilen veri tabanı ismini yazarak bizim hangi veri tabanını kullanacagımız belirleniz ve biz burda diyoruz ki bu model bu app(uygulama) multiapp olan veri tabanını kullanacak bu veri tabanıda multidb şimdi de ip adresimizi alalım myapp/views.py adresine gidin ve şu kodları yazın.
from django.db.models import F
from multiapp.models import Blogviews
def up_blog_view(request,queryset):
try:
ip = request.META["HTTP_X_FORWARDED_FOR"].split(',')[-1].strip()
except:
ip = None
if ip is None:
return False
if not Blogviews.objects.filter(blog = queryset,ip = ip).exists():
Blogviews(content = queryset,ip = ip).save()
queryset.views = F("views") + 1
queryset.save()up_blog_view adında bir fonksiyon yazdık ve iki parametre atadık bunlar birisi gelen istek diğeri ise gelen queryset yanı gelen Blog verisi. request.META[“HTTP_X_FORWARDED_FOR”].split(’,’)[-1].strip() bu kısımda gelen isteğin ip adresini aldık ve eğer None değil ise Blogviews bağlandık exists() ile nesnenin daha önceden kaydı yapılmışmı yapılmamışmı ona baktık eğer yapılmamış ise yeni kayıt oluşturduk ve F(“views”) + 1 kısmı ile izlenmeyi bir arttırdık sonra save() ledik.
Bu fonksiyonu nasıl kullanacagız ?
myapp/views.py ı acın ve şöyle yazın.
from multiapp.views import up_content_view
from models import Blog
def home(request,id):
queryset = Blog.objects.filter(id = id)[0]
up_content_view(request,queryset)işte buna benzer bir kullanım ile bu arada Blog modelinizde izlenme sayılarını tutan integer bir field açmanız gerek views adında.
son aşamalara geldik. Bütün herşey tamam şimdi veritabanı sekranizasyonu var kodlar şu şekilde olmalı
python3 manage.py migrate --database multi
python3 manage.py makemigrations multiapp
python3 manage.py migrate
python3 manage.py makemigrations myappmultiapp/admin.py
from django.contrib.admin import ModelAdmin,site
from multiapp.models import Blogviews
class ViewsAdmin(ModelAdmin):
list_ = ["content_id","ip"]
list_display = list_
list_display_links = list_
search_fields = list_
site.register(Blogviews, ViewsAdmin)
Hakan Çelik