2016-03-16 11 views
5

Sto provando a creare tabelle in modo selettivo in 1 database, ma non nell'altro.Migrazione delle tabelle solo a 1 database su 2 in Django

Nel mio esempio, desidero solo creare tabelle per le app: tlocation e tcategory nel database transforms. Tuttavia, Django sta creando tutte le tabelle nel database transforms.

Ecco la configurazione del router DB:

TRANSFORM_APPS = ('tcategory', 'tlocation') 


class TransformRouter(object): 
    """ 
    A router to control all database operations on models in the 
    "utils_transform" application. 
    """ 
    def db_for_read(self, model, **hints): 
     """ 
     Attempts to read 'transforms' models go to 'transforms' database. 
     """ 
     if model._meta.app_label in TRANSFORM_APPS: 
      return 'transforms' 
     return None 

    def db_for_write(self, model, **hints): 
     """ 
     Attempts to write 'transforms' models go to 'transforms' database. 
     """ 
     if model._meta.app_label in TRANSFORM_APPS: 
      return 'transforms' 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     """ 
     Allow relations if a model in the 'tlocation' app is involved. 
     """ 
     if obj1._meta.app_label in TRANSFORM_APPS or \ 
      obj2._meta.app_label in TRANSFORM_APPS: 
      return True 
     return None 

    def allow_migrate(self, db, app_label, model=None, **hints): 
     """ 
     Make sure the 'tlocation' app only appears in the 'transforms' 
     database. 
     """ 
     if app_label in TRANSFORM_APPS: 
      return db == 'transforms' 
     return None 


class DefaultRouter(object): 
    """ 
    Catch-all Router for all other DB transactions that aren't in the 
    ``utils_transform`` app. 
    """ 

    def db_for_read(self, model, **hints): 
     return 'default' 

    def db_for_write(self, model, **hints): 
     return 'default' 

    def allow_relation(self, obj1, obj2, **hints): 
     if obj1._state.db == obj2._state.db: 
      return True 
     return None 

    def allow_migrate(self, db, app_label, model=None, **hints): 
     return None 

Il comando che sto usando per eseguire le migrazioni è:

./manage.py migrate --database=transforms 

Quando migrano 1 app in un momento solo, come sotto, questo lavori. Ma non posso eseguire senza un filtro app nel comando migrate. Esempio:

./manage.py migrate tlocation --database=transforms 
./manage.py migrate tcategory --database=transforms 
+0

Hai confermato che sta effettivamente creando i tavoli? Poiché l'output di 'migrate' è uguale in entrambi i casi," silenziosamente non eseguirà alcuna operazione su un modello per il quale questo restituisce 'False'". –

+0

@KevinChristopherHenry, sì, sta creando tabelle –

+0

@AaronLelevier Qual è l'ordine dei router nell'impostazione DATABASE_ROUTERS? –

risposta

2

Hai provato managed = False per i modelli che non si desidera creare le tabelle?

class MyModel(models.Model): 
    ... 
    class Meta: 
     managed = False 
+0

Anche questo non sarebbe in grado di discriminare tra i database. Semplicemente non creerebbe le tabelle in nessun DB. –