transactions | 0. | ref_block_num | 29,414 |
---|
ref_block_prefix | 2,448,964,093 |
---|
expiration | 2019-05-20 01:25:08 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | lavalieres |
---|
author | buoyance |
---|
permlink | steem-monster-190518-uoehvcrk |
---|
weight | 10,000 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f1d4f073617dcbb6c1f7b6480460b04d7e58da58c9c9de4ae513c74d643b927401346599d72e8342221195f7a21eeb67f740c3df054a798cb518bf899b2e16e0f |
---|
|
---|
transaction_id | 66f9d7204f95dd10042b7024a4d2e1439b7cd77a |
---|
block_num | 33,059,561 |
---|
transaction_num | 0 |
---|
|
---|
1. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | moving.around |
---|
author | alewesley |
---|
permlink | actifit-alewesley-20190518t194503770z |
---|
weight | 95 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f25ed79a4b1ac39f5fb4c628f524d555554e438ec49b3b34270db048b1910a8694be821fbfddf8c721ed71caaf230a53c29dbe72ecf6a5c37310c8c992e8f18c0 |
---|
|
---|
transaction_id | 53ade6725a73b61b6f30c8562f64ea3fc24664c8 |
---|
block_num | 33,059,561 |
---|
transaction_num | 1 |
---|
|
---|
2. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | corndogg42 |
---|
author | teenagecrypto |
---|
permlink | teenagecrypto-1558313360298-teenagecryptos-twitter-feed--20190520-024920 |
---|
weight | 750 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f5d4bf3aaf3656249883a737afca585f065a4023af0a4e8aaa5978cb596b4a0ea2e7db528d23df2f253b0722107ea05675f19d61403bc19270f0f7d5533729736 |
---|
|
---|
transaction_id | 85c1c7f6a9c5949f15a3045a72d2e89a5674aff2 |
---|
block_num | 33,059,561 |
---|
transaction_num | 2 |
---|
|
---|
3. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | sasaadrian |
---|
author | ace108 |
---|
permlink | top-level-1-commenters-for-20190519-active-hours-and-how-their-comments-looks-like-by-ace108 |
---|
weight | 2,000 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 203ad671fecd8d3063d2789fe83d758a300c958ad3239848c187d5e2ac475b3bf8299ab5f7727e69d1eb50794f071915188ad3d80909bd787b2cd223113e924e32 |
---|
|
---|
transaction_id | 62e859396f2a0891c7fa31be662d1feda79ab699 |
---|
block_num | 33,059,561 |
---|
transaction_num | 3 |
---|
|
---|
4. | ref_block_num | 29,415 |
---|
ref_block_prefix | 3,358,020,364 |
---|
expiration | 2019-05-20 01:25:39 |
---|
operations | 0. | 0. | custom_json |
---|
1. | required_auths | [] |
---|
required_posting_auths | |
---|
id | sm_find_match |
---|
json | {"match_type":"Ranked","app":"steemmonsters/0.5.2.2"} |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 202515d9fc92c4a511a08dae3c91d75b5f0800dc3faae14e75c5d11b424abcdca029491b86ff81e331926c82dd709e6b7a04f233a70903d3c277e16cf1fe6aeb8a |
---|
|
---|
transaction_id | 111b5afdfe2cf6cc162da5e8c77cb36714d870bd |
---|
block_num | 33,059,561 |
---|
transaction_num | 4 |
---|
|
---|
5. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | scuzzy |
---|
author | lordless.exile |
---|
permlink | ifc-s2r16-create-a-word |
---|
weight | 50 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 20038a5013068da83be6cfc92d9d6cfe1ad76090d4e5a529dad6baf077e39166603cbf3d461c16455dd04844d87b7331fb2b21606b02b677af3ebcdbf5641e3f34 |
---|
|
---|
transaction_id | 572ef6c19c34da6526a3f1a56e4c53a72cdc6437 |
---|
block_num | 33,059,561 |
---|
transaction_num | 5 |
---|
|
---|
6. | ref_block_num | 29,395 |
---|
ref_block_prefix | 943,842,478 |
---|
expiration | 2019-05-20 01:34:36 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | elviento |
---|
author | matheusggr |
---|
permlink | matheusggr-1558315310568-matheusggrs-twitter-feed--20190520-032150 |
---|
weight | 44 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 202642f38d6f924fbfa320ad5cc6c5975d11e03eda9ff99b9aa2d01759dbcd4d2c648a84a7fb61ae3c5c6aec15846e95b2495a481f447bca1ac69d5c5b369fa3a6 |
---|
|
---|
transaction_id | 70b26a838f6cf7fc40de2f11619df58e84f63315 |
---|
block_num | 33,059,561 |
---|
transaction_num | 6 |
---|
|
---|
7. | ref_block_num | 29,412 |
---|
ref_block_prefix | 4,158,604,224 |
---|
expiration | 2019-05-20 01:25:38 |
---|
operations | 0. | 0. | transfer |
---|
1. | from | epicdice |
---|
to | banner8888 |
---|
amount | 1.043 HIVE |
---|
memo | "You have Won! Dice Rolled: 20. Your Prediction: Below 95. Multiplier: 1.04. Win Chance: 94%
{"diceRolled": "20", "TransactionId": "670888c1bffee3430daffe396450d4e804a1fdb6", "BlockNumber": "33059559", "betAmount": "1", "currency": "STEEM", "player": "banner8888", "isValid": true}" |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f070e857fcab0c10e80ce45cc3be928beb8599e39ae8e2081fe37e09ce83722de050b26e30618f820a24aa646baae681d13f97f6c45ac33db8d8b9f90ee9edf3a |
---|
|
---|
transaction_id | 9d098504180c19e39777d2852afb0598727e18e7 |
---|
block_num | 33,059,561 |
---|
transaction_num | 7 |
---|
|
---|
8. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | asbear |
---|
author | lordless.exile |
---|
permlink | ifc-s2r16-create-a-word |
---|
weight | 500 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f4d97c8abbc1cb926a4e22a0d72d3e7b1a3f52446898b8e9f4349b45280c2e94102ae3be14e41b3f9acf3f9ad5da6f434a9fdcab99e7971b4a225b8f31a76d0c1 |
---|
|
---|
transaction_id | 52036bd4fc741eb98b1da60cd543902736607fa5 |
---|
block_num | 33,059,561 |
---|
transaction_num | 8 |
---|
|
---|
9. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | gohtian |
---|
author | hilman1 |
---|
permlink | sajian-spesial-kuah-keumamah-aceh-ajp4xmzr |
---|
weight | 10,000 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f5b342a62c5c823a5d84bdb0daf9dc19c87a178374101f56f641c7e83623adbc0029d98ab2c47e5ad582bd6c3bf3f07932444372a272b502878cc0636099ea131 |
---|
|
---|
transaction_id | 5bee444c12aa5df192aa790e520c728420d7d108 |
---|
block_num | 33,059,561 |
---|
transaction_num | 9 |
---|
|
---|
10. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | aceaeterna |
---|
author | africa |
---|
permlink | or-gaming-or-league-of-legends-or-nami-support-fr-8-part-1 |
---|
weight | 10,000 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 203c41fb05ccf8e667db4174e48eb28f55cf44deb0c3b6af5b146fc3a18f8b29e05be336ac053f29bedc98a8647846b62a49fbd4158032340e6e520d33b6ce4924 |
---|
|
---|
transaction_id | a6a9d8af43c637bc9290155452effaa19070af58 |
---|
block_num | 33,059,561 |
---|
transaction_num | 10 |
---|
|
---|
11. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | gharrington44 |
---|
author | cryptokos |
---|
permlink | service-in-your-marketing-message |
---|
weight | 500 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 205cc793f2c1cfec6b8c39ecbaffafceafd6f9c1ba1d0145d29a9cda64c2b2f72279beb63328d2f1621624b8ddf59bfdb462d4213c802683687d44638deb3b6f30 |
---|
|
---|
transaction_id | 03f6e948fa783fd320f1594885cb4d1f2fd9e94c |
---|
block_num | 33,059,561 |
---|
transaction_num | 11 |
---|
|
---|
12. | ref_block_num | 29,415 |
---|
ref_block_prefix | 3,358,020,364 |
---|
expiration | 2019-05-20 01:25:40 |
---|
operations | 0. | 0. | custom_json |
---|
1. | required_auths | [] |
---|
required_posting_auths | |
---|
id | drugwars |
---|
json | {"date":"2019-05-20T01:24:40.168Z"} |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f20003648e318710d717a797162f7f5940cdea9943f903594db2d194b45b7f6e43f118007e4b82960c17d694d35a5318e44b43714f0cca39d9bc3d6b645199484 |
---|
|
---|
transaction_id | 247f74a6fb689b6890387843620c49ad9dc203de |
---|
block_num | 33,059,561 |
---|
transaction_num | 12 |
---|
|
---|
13. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | chimzycash |
---|
author | cryptokos |
---|
permlink | service-in-your-marketing-message |
---|
weight | 500 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f4dafea3a92cb55f1c0913d8ef7eabb5106dcc88235977e6383839adeb95db1e14704271b395909b168683699c18a19d2ce7874841a20c6abc8f1bb78be2a9e30 |
---|
|
---|
transaction_id | 47865120d7b27b49c97ee720e38b179b1fec8953 |
---|
block_num | 33,059,561 |
---|
transaction_num | 13 |
---|
|
---|
14. | ref_block_num | 29,395 |
---|
ref_block_prefix | 943,842,478 |
---|
expiration | 2019-05-20 01:34:36 |
---|
operations | 0. | 0. | transfer |
---|
1. | from | bluesniper |
---|
to | magicdice |
---|
amount | 0.141 HIVE |
---|
memo | "under 67 mydicebotkpspx99rvg" |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 20780d7b7abfa4f522caf1a98509895b699f6a0d86c288f52f0d188377fadf087b2387910851c660771676bfe518dabe4ec4fad432e935416993a61c9e0e42ba79 |
---|
|
---|
transaction_id | 22c22ee7067d42eee4c17a1cc160b209f245acaf |
---|
block_num | 33,059,561 |
---|
transaction_num | 14 |
---|
|
---|
15. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | happyphoenix |
---|
author | cryptokos |
---|
permlink | service-in-your-marketing-message |
---|
weight | 500 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 2008d84342e4989181f257466b32e1765ed669c9576abbc76b3e5fb0cc5eadfed862aa4ee3b77da5c5697939918112b7df6b6e3a68f20249eefb18005fe9b34b19 |
---|
|
---|
transaction_id | 6432aefb95be83b36f61315dd2b87f9dc002a251 |
---|
block_num | 33,059,561 |
---|
transaction_num | 15 |
---|
|
---|
16. | ref_block_num | 29,395 |
---|
ref_block_prefix | 943,842,478 |
---|
expiration | 2019-05-20 01:34:36 |
---|
operations | 0. | 0. | transfer |
---|
1. | from | radka |
---|
to | magicdice |
---|
amount | 0.355 HIVE |
---|
memo | "over 30 roEsYCggBf" |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 20095514924b3cb6b5a0d7ac9e4efb20472101d11dd9e638fd5bdc1a6faad18f9d0cc16c4283efdcf453f0549446b2fb5c41f5d90e5c09f72a220f3d1e1dff358d |
---|
|
---|
transaction_id | 5cbe4f3c914e6c051de8de1f51b83fb482905855 |
---|
block_num | 33,059,561 |
---|
transaction_num | 16 |
---|
|
---|
17. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | vote |
---|
1. | voter | walker886 |
---|
author | m18207319997 |
---|
permlink | 0520sct |
---|
weight | 10,000 |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f04815462b85084c21e1bdb19a02db5f8c2de6c3a2ab10af60c643eb516bd529114fe70f636b7fbd9e33be583c81c946e849051669d9965fc79aa4f1a64f658f1 |
---|
|
---|
transaction_id | 21f6d41f67efba2385dac7a6647bca9e2ac3409e |
---|
block_num | 33,059,561 |
---|
transaction_num | 17 |
---|
|
---|
18. | ref_block_num | 29,415 |
---|
ref_block_prefix | 3,358,020,364 |
---|
expiration | 2019-05-20 01:29:39 |
---|
operations | 0. | 0. | comment |
---|
1. | parent_author | steemcleaners |
---|
parent_permlink | steemcleaners-report-for-10-may-2019 |
---|
author | animalcontrol |
---|
permlink | animal-suppression-steemcleaners-1558315479049 |
---|
title | "" |
---|
body | "^flag @steemcleaners
https://www.youtube.com/watch?v=A9QTSyLwd4w" |
---|
json_metadata | "" |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 207709f2cfe2bfcf5dd48a11c3a522b51f1bc4c4066a0ab961b8f7127a9895ad916d82316453c914f8ab2c380076e0b8b4ccad4733539cff391934ef11ca744e7a |
---|
|
---|
transaction_id | 77639f579577883247f7791e280a08fb59d8c2b2 |
---|
block_num | 33,059,561 |
---|
transaction_num | 18 |
---|
|
---|
19. | ref_block_num | 29,395 |
---|
ref_block_prefix | 943,842,478 |
---|
expiration | 2019-05-20 01:34:36 |
---|
operations | 0. | 0. | comment |
---|
1. | parent_author | "" |
---|
parent_permlink | utopian-io |
---|
author | hakancelik |
---|
permlink | how-to-use-multiple-databases-in-django-project-tr-bir-projede-birden-fazla-veri-tabani-nasil-kullanilir-uygulamali-oegretici |
---|
title | "Django Projesinde Birden Fazla Veri Tabanı Kullanımı" |
---|
body | "#### 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](https://steemit.com/utopian-io/@tolgahanuzun/what-is-virtualenv-and-how-is-it-used-tr-virtualenv-nedir-ve-nasil-kullanilir)
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](www.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.
```python
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.
```python
python3 manage.py startapp multiapp
```
şimdi yeni bir uygulamamız oluştu. Tekrar settings.py adresine gelin ve şöyle yapın.
```python
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.
```python
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.
```python
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.
```python
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(requesti,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ı
```python
python3 manage.py migrate --database multi
python3 manage.py makemigrations multiapp
python3 manage.py migrate
python3 manage.py makemigrations myapp
```
## multiapp/admin.py
```python
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)
```
## sonuç ?
![birden_fazla_veri_tabani](https://www.coogger.com/media/images/birden_fazla_veri_tabani.png)
![birden_fazla_veri_tabani](https://www.coogger.com/media/images/birden_fazla_veri_tabani_Rfated5.png)" |
---|
json_metadata | "{"format":"markdown","tags":["utopian-io","tr","django","python"],"app":"steemit/0.1","ecosystem":{"name":"coogger","version":"1.4.1","dapp":"coogger","topic":"django","category":"tutorial","language":"turkish","address":"https://github.com/django/django/","body":"#### Neler öğreneceğiz ?\r\n- django ile birden fazla veri tabanı kullanımını\r\n- django ile uygulama oluşturmayı\r\n- ziyaretçilerin ip adreslerini bulmayı öğreneceğiz \r\n- **from django.db.models import F** kullanımını öğreneceğiz.\r\n\r\n#### Gerekenler\r\n\r\n- python3\r\n- django 1.11\r\n- Virtualenv\r\n\r\nVirtualenv için bilgiye ihtiyacınız varsa şu adresi inceliyebilirsiniz. [Virtualenv](https://steemit.com/utopian-io/@tolgahanuzun/what-is-virtualenv-and-how-is-it-used-tr-virtualenv-nedir-ve-nasil-kullanilir)\r\n\r\nYukarıda verdiğim adresten Virtualenv kurulumunu ve gerekli paketleri requirements'leri kurun.\r\n\r\n[===========]\r\n\r\nNeden birden fazla veri tabanı kullanımı yapayım diye soruyor iseniz size şöyle bir örnekle açıklayabirim, ben [coogger.com](www.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.\r\n\r\n### Öncelikle neye ihtiyacımız var ?\r\n\r\nŞimdi sizin zaten bir tane django projeniz hali hazırda olması gerek içinde myapp olarak bir tane uygulamanız var diyelim\r\nsettings.py dosyanızda ki veri tabanı ayarı kısmı şu şekildedir.\r\n\r\n```python\r\nDATABASES = {\r\n 'default': {\r\n 'ENGINE': 'django.db.backends.sqlite3',\r\n 'NAME': os.path.join(BASE_DIR, 'sqlite3'),\r\n },\r\n}\r\n```\r\ndoğrumu doğru. şimdi myapp adındaki uygulama dizinize gelin ve yeni bir uygulama oluşturmak için konsolu açıp şunu yazın.\r\n\r\n```python\r\npython3 manage.py startapp multiapp\r\n```\r\nşimdi yeni bir uygulamamız oluştu. Tekrar settings.py adresine gelin ve şöyle yapın.\r\n\r\n```python\r\nINSTALLED_APPS = [\r\n \"multiapp\",\r\n \"myapp\",\r\n.....\r\n]\r\nDATABASES = {\r\n 'default': {\r\n 'ENGINE': 'django.db.backends.sqlite3',\r\n 'NAME': os.path.join(BASE_DIR, 'sqlite3'),\r\n },\r\n 'multi': {\r\n 'ENGINE': 'django.db.backends.sqlite3',\r\n 'NAME': os.path.join(BASE_DIR, 'multidb'),\r\n },\r\n}\r\nDATABASE_APPS_MAPPING = {'multiapp': 'multi'}\r\n```\r\noluşturduğumuz yeni uygulamamızı INSTALLED_APPS bölümüne ekledik ve ikinci veri tabanımızı ayarladık.\r\n**DATABASE_APPS_MAPPING** bu kısım hangi uygulamanın hangi veri tabanını kullanacagını seçmemizde bize yardımcı olacak.\r\n\r\n**multiapp/models.py adresine gidin** ve ziyaratçilerden alacağımız ip adreslerin kaydı için bir model yazalım tıpkı şöyle.\r\n\r\n```python\r\nfrom django.db import models\r\nfrom myapp.models import Blog \r\n\r\nclass Blogviews(models.Model):\r\n content = models.ForeignKey(Blog ,on_delete=models.CASCADE) \r\n ip = models.GenericIPAddressField() # ve ip adres için olan alanımız\r\n\r\n class Meta:\r\n app_label = 'multiapp' \r\n```\r\n\r\nmyapp 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**\r\nşimdi de ip adresimizi alalım **myapp/views.py** adresine gidin ve şu kodları yazın.\r\n\r\n```python\r\nfrom django.db.models import F\r\nfrom multiapp.models import Blogviews\r\n\r\ndef up_blog_view(request,queryset):\r\n try:\r\n ip = request.META[\"HTTP_X_FORWARDED_FOR\"].split(',')[-1].strip()\r\n except:\r\n ip = None\r\n if ip is None:\r\n return False\r\n if not Blogviews.objects.filter(blog = queryset,ip = ip).exists():\r\n Blogviews(content = queryset,ip = ip).save()\r\n queryset.views = F(\"views\") + 1\r\n queryset.save()\r\n```\r\n\r\n**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.\r\n**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.\r\n\r\n### Bu fonksiyonu nasıl kullanacagız ? \r\nmyapp/views.py ı acın ve şöyle yazın.\r\n```python \r\nfrom multiapp.views import up_content_view\r\nfrom models import Blog\r\n\r\ndef home(request,id):\r\n queryset = Blog.objects.filter(id = id)[0]\r\n up_content_view(requesti,queryset) \r\n```\r\n\r\niş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.\r\n\r\nson aşamalara geldik.\r\nBütün herşey tamam şimdi veritabanı sekranizasyonu var \r\nkodlar şu şekilde olmalı \r\n\r\n```python\r\npython3 manage.py migrate --database multi\r\npython3 manage.py makemigrations multiapp\r\npython3 manage.py migrate\r\npython3 manage.py makemigrations myapp\r\n```\r\n\r\n## multiapp/admin.py\r\n\r\n```python\r\nfrom django.contrib.admin import ModelAdmin,site\r\nfrom multiapp.models import Blogviews\r\n\r\nclass ViewsAdmin(ModelAdmin):\r\n list_ = [\"content_id\",\"ip\"]\r\n list_display = list_\r\n list_display_links = list_\r\n search_fields = list_\r\n\r\nsite.register(Blogviews, ViewsAdmin)\r\n```\r\n\r\n## sonuç ?\r\n[![image](https://i.hizliresim.com/jyVQ4r.png)](https://hizliresim.com/jyVQ4r)\r\n[![image](https://i.hizliresim.com/Z97OLG.png)](https://hizliresim.com/Z97OLG)"},"image":["https://www.coogger.com/media/images/birden_fazla_veri_tabani.png","https://www.coogger.com/media/images/birden_fazla_veri_tabani_Rfated5.png"],"links":["https://steemit.com/utopian-io/@tolgahanuzun/what-is-virtualenv-and-how-is-it-used-tr-virtualenv-nedir-ve-nasil-kullanilir","www.coogger.com"]}" |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f5fb665d5674468ac143bf92a8b3e6551a4b7234c156393800997d45d54c2d17c6198ce873eee6dc4eb1f4b87eb78bb90964b4208f48fa1dc6734bfb7419c5b1d |
---|
|
---|
transaction_id | 714c8322f5a0d6fa175d2a22c11edaa19423428d |
---|
block_num | 33,059,561 |
---|
transaction_num | 19 |
---|
|
---|
20. | ref_block_num | 29,400 |
---|
ref_block_prefix | 3,603,447,709 |
---|
expiration | 2019-05-20 01:34:39 |
---|
operations | 0. | 0. | custom_json |
---|
1. | required_auths | [] |
---|
required_posting_auths | |
---|
id | sm_gift_cards |
---|
json | {"to":"proelite","cards":["C3-106-ECR18T935S","C3-106-UC17FGKP1C"],"app":"steemmonsters/0.5.2.2"} |
---|
|
---|
|
---|
|
---|
extensions | [] |
---|
signatures | 0. | 1f6bfafff10f0a67317a91a1b8d5d96ca84d5c7000999b16c2c28b1ad73d0bb45f6c4828c09aed53ddfb376f7d509f0846860ae66d45daccb1d50cddbb4744d82d |
---|
|
---|
transaction_id | 9b102515df8a578dfee55d7463bcbab92c4ef976 |
---|
block_num | 33,059,561 |
---|
transaction_num | 20 |
---|
|
---|
|
---|