私は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
は私が間違ってやっている何かがありますか?
これはまだデフォルトのデシベルでモデルを作成する場所場合。それでも理由を教えられない – maxuville
あなたのモデルにアプリラベルが付いていることを確認できますか?これが上記のコードで間違っている唯一の方法です。私は本質的に、マッピングが見つからなければデフォルトのデータベースを返し、そうでなければマップされたデータベースを返します。 – Jag
モデルのMetaクラスを使用してapp_labelを追加しましたが、それでも機能しません。テーブルは引き続きデフォルトのデータベースに作成されます。 – maxuville