2016-10-12 20 views
0

私はDjango 1.10とPython 2.7を使ってプロジェクトをやっています。Djangoマルチアプリケーションデータベースルータが動作しません

私はthis pageに従ってデータベースルーティングを読み込み、実装しようとしました。私はまた、多くの異なるチュートリアルやその他のスタックオーバーフローに関する質問を読んでいます。しかし、私はそれを動作させるように見えることはできません。

これは私が持っているシナリオです:

私は、デフォルトのデータベース上のすべての分析、authおよび管理アプリケーションモデルを必要としています。別のデータベースのキャンセルアプリ、別の別のデータベースのdriveractivityアプリ。

これは私が使用しているルータです:

from django.conf import settings 


class AppRouter: 
    def db_for_read(self, model, **hints): 
     if model._meta.app_label == 'analytics': 
      return 'default' 

     elif model._meta.app_label == 'cancellation': 
      return 'cancellations_db' 

     elif model._meta.app_label == 'driveractivity': 
      return 'driveractivity_db' 

     return None 

    def db_for_write(self, model, **hints): 
     if model._meta.app_label == 'analytics': 
      return 'default' 

     elif model._meta.app_label == 'cancellation': 
      return 'cancellations_db' 

     elif model._meta.app_label == 'driveractivity': 
      return 'driveractivity_db' 

     return None 

    def allow_migrate(self, db, app_label, model=None, **hints):  
     if app_label == 'cancellation' and db == 'cancellations_db': 
      return True 

     if app_label == 'driveractivity' and db == 'driveractivity_db': 
      return True 

     if app_label in ('analytics', 'auth', 'admin', 'contenttypes', 'sessions', 'rest_framework') and db == 'default': 
      return True 

     return False 

を(settings.py)次のように私のデータベースの設定は、次のとおりです。

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'HOST': 'localhost', 
     'NAME': 'analytics', 
     'USER': 'root' 
    }, 
    'driveractivity_db': { 
     'ENGINE': 'django.db.backends.mysql', 
     'HOST': 'localhost', 
     'PORT': '3306', 
     'NAME': 'driveractivity', 
     'USER': 'root', 
    }, 
    'cancellations_db': { 
     'ENGINE': 'django.db.backends.mysql', 
     'HOST': 'localhost', 
     'PORT': '3306', 
     'NAME': 'teke_cancellation', 
     'USER': 'root' 
    } 
} 

DATABASE_ROUTERS = ['analytics.AppRouter.AppRouter'] 

DB_Mapping = { 
    "cancellation": "cancellations_db", 
    "driveractivity": "driveractivity_db" 
} 

models.py - キャンセル

class Cancellation(models.Model): 
    id = models.IntegerField(primary_key=True) 
    user = models.EmailField(max_length=255,blank=False) 
    time = models.DateField(blank=False) 
     created_at = models.DateTimeField(auto_now=True,auto_now_add=False) 
    updated_at = models.DateTimeField(auto_now=False,auto_now_add=True) 

    class Meta: 
     app_label = 'cancellation' 


class PenaltyType(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=255,blank=False) 
    created_at = models.DateTimeField(auto_now=True,auto_now_add=False) 
    updated_at = models.DateTimeField(auto_now=False,auto_now_add=True) 

    class Meta: 
     app_label = 'cancellation' 


class Penalty(models.Model): 
    id = models.IntegerField(primary_key=True) 
    user = models.EmailField(max_length=255,blank=False) 
    meted = models.BooleanField(default=False) 
    penalty_type = models.ForeignKey(PenaltyType) 
    created_at = models.DateTimeField(auto_now=True,auto_now_add=False) 
    updated_at = models.DateTimeField(auto_now=False,auto_now_add=True) 

    class Meta: 
     app_label = 'cancellation' 

models.py - driveractivity

class Activity(models.Model): 
    email = models.EmailField(null=False) 
    driver_name = models.CharField(max_length=30,null=False) 
    vehicle_reg = models.CharField(max_length=30,null=False) 
    status = models.CharField(max_length=15) 
    desc = models.CharField(max_length=250) 
    lng = models.FloatField() 
    lat = models.FloatField() 
    time = models.DateTimeField() 
    created_at = models.DateTimeField(auto_now=True,auto_now_add=False) 
    updated_at = models.DateTimeField(auto_now=False,auto_now_add=True) 

    class Meta: 
     app_label = 'driveractivity' 


class DistanceDetails(models.Model): 
    email = models.EmailField(null=False) 
    driver_name = models.CharField(max_length=30,null=False) 
    vehicle_reg = models.CharField(max_length=30,null=False) 
    new_lng = models.FloatField() 
    new_lat = models.FloatField() 
    last_state = models.CharField(max_length=15,null=False) 
    last_lng = models.FloatField() 
    last_lat = models.FloatField() 
    created_at = models.DateTimeField(auto_now=True,auto_now_add=False) 
    updated_at = models.DateTimeField(auto_now=False,auto_now_add=True) 

    class Meta: 
     app_label = 'driveractivity' 

編集router.py

class AppRouter(object): 
    def db_for_read(self, model, **hints): 
     return DB_Mapping.get(model._meta.app_label, 'default') 

    def db_for_write(self, model, **hints): 
     return DB_Mapping.get(model._meta.app_label, 'default') 

    def allow_migrate(self, db, app_label, model=None, **hints): 
     if app_label in DB_Mapping.keys() or db in DB_Mapping.values(): 
      return True 
     else: 
      return None 

は私が間違ってやっている何かがありますか?

答えて

0

チェックこれはあなたのために働く場合:

DB_Mapping = { 
    "cancellation": "cancellation_db", 
    "driveractivity": "driveractivity_db", 
    ... 
} 

router.py

settings.py

from project.settings import DB_Mapping 

class MyRouter(object): 
    def db_for_read(self, model, **hints): 
     return DB_Mapping.get(model._meta.app_label, 'default') 

    def db_for_write(self, model, **hints): 
     return DB_Mapping.get(model._meta.app_label, 'default') 

私は同様のセットアップを使用して行う場所への私のルート要求を行っているユーザーのグループに基づいて異なるデータベースユーザー

allow_migrateも同様に書き込むことができます。、db == 'default'またはif model._meta.app_label in DB_Mapping.keys() or db in DB_Mapping.values(): return True else False

+0

これはまだデフォルトのデシベルでモデルを作成する場所場合。それでも理由を教えられない – maxuville

+0

あなたのモデルにアプリラベルが付いていることを確認できますか?これが上記のコードで間違っている唯一の方法です。私は本質的に、マッピングが見つからなければデフォルトのデータベースを返し、そうでなければマップされたデータベースを返します。 – Jag

+0

モデルのMetaクラスを使用してapp_labelを追加しましたが、それでも機能しません。テーブルは引き続きデフォルトのデータベースに作成されます。 – maxuville

関連する問題