Django 迁移特定的数据库和模型

问题描述

我试图创建一个数据库,我做到了。我在setting.py上写了这样的代码

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2','NAME': 'baseDB','USER': 'admin','PASSWORD': 'admin','HOST': '127.0.0.1','PORT': '1234',},'android': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2','NAME': 'androidDB','ios': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2','NAME': 'iosDB',}       
}

而且我已经创建了两个models.py,例如:

class AndroidModel(models.Model):
    name = models.CharField(default=False)
    version = models.CharField()
    
    class Meta:
        app_label = 'android_label'

class IosModel(models.Model):
    name = models.CharField(default=False)
    version = models.CharField()
    
    class Meta:
        app_label = 'ios_label'     

然后我创建了一个名为 dbrouters 的路由,类是 MyDbrouter,代码如下:

from api.models import AndroidModel,IosModel

class MyDbrouter(object):
    def db_for_read(self,model,**hints):
        if model._Meta.app_label == 'android_label':
            return 'android'

        if UserJembatani._Meta.app_label == 'ios':
            return 'ios'

        else:
            return 'default'
        return None

    def db_for_write(self,**hints):
        if model._Meta.app_label == 'android_label':
            return 'android'

        if UserJembatani._Meta.app_label == 'ios_label':
            return 'ios'

        else:
            return 'default'

        return None

    def allow_relation(self,obj1,obj2,**hints):
        if obj1._Meta.app_label == 'android_label' or \
           obj2._Meta.app_label == 'android_label':
           return True

        if obj1._Meta.app_label == 'ios_label' or \
           obj2._Meta.app_label == 'ios_label':
           return True

        else:
            return 'default'           
        return None

    def allow_migrate(self,db,app_label,model_name=None,**hints):
        if not UserJembatani._Meta.app_label == 'android_label':
            return'android' == db

        if not UserJembatani._Meta.app_label == 'ios_label':
            return'ios' == db

        else:
            return 'default' == db

        return None

而且我将 DATABASE_ROUTERS 放在 setting.py 中:

DATABASE_ROUTERS = ('app_mobile.dbrouters.MyDbrouter',)

在那之后,我决定使用命令行迁移它:

python manage.py migrate --database=android

python manage.py migrate --database=android

但是问题。当我尝试执行该命令时,它们两个模型总是创建到两个数据库中。目标是,我希望模型 android 只是在 android 数据库中创建为一个表,并且对于 ios 模型也喜欢相同的条件。

解决方法

您可以尝试类似的方法(有关详细信息,请参阅 https://www.webforefront.com/django/modelmultidatabases.html

def allow_migrate(self,db,app_label,model_name=None,**hints):
        if db == 'ios':            
            if app_label in ['auth','admin','ios']:
                return True            
            elif app_label=='android':                
                return False
        elif db == 'android':
            if app_label in ['auth','android']:
                return True            
            elif app_label=='ios':                
                return False    
        return None