Django MultiApp数据库路由器不工作

2024-04-24 17:09:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用django1.10和python2.7做一个项目。在

我已经阅读并尝试根据this page实现数据库路由。我也读了很多不同的教程和其他stackoverflow问题。然而,我似乎不能让它发挥作用。在

这是我的场景:

我需要所有的分析,认证和管理应用程序模型的默认数据库。然后取消应用程序在一个单独的数据库,和驱动程序应用程序在另一个单独的数据库。在

这是我正在使用的路由器:

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

我的数据库设置如下(设置.py):

^{pr2}$

模型.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'

模型.py-驾驶练习

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'

编辑路由器.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

我做错什么了吗?在


Tags: falsetrueappautodbmodelreturnmodels
1条回答
网友
1楼 · 发布于 2024-04-24 17:09:31

检查这是否适合您:

设置.py

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

路由器.py

^{pr2}$

我确实使用了类似的设置,根据发出请求的用户组路由到不同的数据库用户。在

allow_migrate也可以类似地编写,其中如果db == 'default'或{}

相关问题 更多 >