2016-08-15 1 views
0

У меня есть приложение Django под названием dataapi, которое создается путем интроспекции базы данных PostgreSQL для записи различных файлов моделей (по одной для каждой схемы). Он работает и предоставляет нам доступ только для чтения к данным, которые нам нужны через ORM, но я разбиваю модели на несколько файлов по схеме, а не на их размещение в (огромном) файле models.py.Почему приложение Django пытается создать миграции, когда определено, что он не позволяет выполнять миграцию в маршрутизаторе?

я определил ROOT/config/routers.py файл сказать Django Я не хочу модель этого приложения, чтобы использовать миграции:

class DataAPIRouter(object): 
    """ 
    A router to control all database operations on models in the 
    dataapi application. 
    """ 

    def db_for_read(self, model, **hints): 
     """ 
     Attempts to read dataapi models go to mssqlwrds. 
     """ 

     if model._meta.app_label == 'dataapi': 
      return 'pgdata' 
     return None 


    def db_for_write(self, model, **hints): 
     """ 
     Attempts to write dataapi models go to mssqlwrds. 
     """ 

     if model._meta.app_label == 'dataapi': 
      return 'pgdata' 
     return None 


    def allow_relation(self, obj1, obj2, **hints): 
     """ 
     Allow relations if a model in the dataapi app is involved. 
     """ 

     if obj1._meta.app_label == 'dataapi' or obj2._meta.app_label == 'dataapi': 
      return True 
     return None 


    def allow_migrate(self, db, app_label, model_name=None, **hints): 
     """ 
     Make sure the dataapi app doesn't use migrations. 
     """ 

     if app_label == 'dataapi': 
      return False 
     return True 

В моих настройках, я определил маршрутизатор:

DATABASE_ROUTERS = [ 
    'config.routers.DataAPIRouter', 
] 

Тем не менее, когда я запускаю сухой пробег с использованием makemigrations, он по-прежнему показывает, что он наносит удар по приложению:

(project) [[email protected] project]$ ./manage.py makemigrations --dry-run 
Migrations for 'dataapi': 
    0001_initial.py: 
    - Create model aco_amda 
    - Create model aco_imda 
    - Create model aco_indfnta 
    - Create model aco_indfntq 
    [...] 

Я что-то упускаю? Как я могу заставить это приложение игнорировать миграции?

+0

Он игнорируется. 'allow_migrate' предотвращает _execution_ миграции в приложении' dataapi'. Он по-прежнему создает миграцию, вот как это работает. – knbk

+0

Ах, спасибо за разъяснения. Я дам PR, чтобы обновить документацию с помощью этого разъяснения. Очень признателен! Если вы представите это в качестве ответа, я сделаю это правильно. – FlipperPA

ответ

0

Как выясняется, это по дизайну. Как отметил @knbk, этот параметр в маршрутизаторе останавливает миграцию только при выполнении python manage.py migrate. Он будет создать миграции при запуске python manage.py makemigrations. Я опубликовал PR для Django, чтобы разъяснить это в документации, которая была принята.

+0

Эй. Я просто столкнулся с этим. Так я должен удалить сгенерированную миграцию? Если я не удалю его, приложение появится в списке миграций во время команды 'migrate', например. 'Операции для выполнения: применить все миграции: app_that_shouldnt_show_up, auth, contenttypes, session. Запуск миграции: применение app_that_shouldnt_show_up.0001_initial ... OK ... ' – shadi

+0

Прошло некоторое время с тех пор, как я работал над этим, но я считаю, что я просто подделал его с помощью' python manage.py migrate appname --fake'. Это будет означать, что он запускается в базе данных без фактического запуска, IIRC. – FlipperPA

Смежные вопросы