2014-10-28 10 views
14

Tworzę niektóre dynamiczne modele Django w mojej aplikacji i wszystko wydaje się działać zgodnie z oczekiwaniami, z wyjątkiem systemu migracji.Django 1.7 - makewigracje powodujące migrację do niezarządzanego modelu

Jeśli utworzę dynamiczny model Django i ustawię managed = False, komenda Django makemigrations nadal generuje migrację dla tego nowego modelu. Migracja wygląda mniej więcej tak:

class Migration(migrations.Migration): 

    dependencies = [ 
     ('atom', '0001_initial'), 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='books', 
      fields=[ 
      ], 
      options={ 
       'db_table': 'books', 
       'managed': False, 
      }, 
      bases=(models.Model,), 
     ), 
    ] 

Jeśli nie tworzyć migracji, kiedy biegnę python manage.py migrate, widzę następujący komunikat (w dużych przerażające czerwonymi literami):

Your models have changes that are not yet reflected in a migration, and so won't be applied. 
Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them. 

Czy czy istnieje sposób, aby powiedzieć systemowi migracji w Django 1.7, aby zignorował niezarządzane modele razem? a może ustawienie migrations = False w klasie Meta modeli?

UPDATE: o wyjaśnienia, używam metody do tworzenia moje dynamiczne modele podobne do tych, które opisano w następujących miejscach:

ten Metoda jest świetna do generowania modeli dynamicznych na podstawie informacji przechowywanych w moich modelach konfiguracji (https://code.djangoproject.com/wiki/DynamicModels#Adatabase-drivenapproach). Musiałem zarejestrować sygnał, aby wyczyścić pamięć podręczną modelu django, aby przechwytywać zmiany w modelach, gdy instancja konfiguracji została zmieniona, ale wszystko wydaje się działać dobrze, z wyjątkiem faktu, że generowane są migracje dla tych modeli. Jeśli usuniemy jedną z konfiguracji, a model zostanie usunięty z pamięci podręcznej Django, migracja będzie musiała zostać zaktualizowana ponownie, usuwając model, który nie powinien mieć na uwadze.

Te modele dynamiczne nie są specjalnie używane w aplikacji. Nie gdzie w kodzie odwołuję się do modelu książki (z powyższego przykładu). Są generowane w środowisku wykonawczym i wykorzystywane do odczytywania informacji ze starszych tabel, do których zapewniają dostęp.

+0

Ale czy migracja rzeczywiście powoduje problem? Oznacza to, że po uruchomieniu polecenia "migrate" błędnie tworzy modele w bazie danych? Jeśli nie, naprawdę nie ma problemu. System migracji dotyczy nie tylko zmian na poziomie bazy danych, stara się stworzyć możliwie dokładny obraz modeli w pamięci, jak to tylko możliwe. –

+0

To prawda. Migracje nie powodują problemu. Jednak w dynamicznym systemie, gdzie przez cały czas istnieją potencjalnie nowe modele. Byłoby miło, gdybym mógł wskazać systemowi migracji, że nie musi się martwić o te konkretne modele. – chadgh

+0

Czy możesz podać nam więcej informacji na temat generowania modeli dynamicznych? Głównie jakie dane są wymagane do ich dynamicznego generowania. –

Odpowiedz

4

Krótka odpowiedź brzmi, że Django nie jest do tego zbudowany. Dokonywanie modelu "niezarządzanego" only means Django will not create or delete the table for it -- nothing else.

Powiedział, że jeśli nie masz regularne modele Oprócz tych dynamicznych modeli w tej samej aplikacji można warunkowo dodać aplikację do INSTALLED_APPS w settings.py:

if not ('makemigrations' in sys.argv or 'migrate' in sys.argv): 
    INSTALLED_APPS += (
     'app_with_dynamic_models', 
     'another_app_with_dynamic_models', 
    ) 

ten powinien uczynić Django ignorować aplikację przy tworzeniu i prowadzenie migracji. Jednak ostatecznie będziesz musiał wykonać i uruchomić migracje dla modeli, jeśli chcesz z nich korzystać, ponieważ the ability to have apps which do not use migrations is meant to go away in Django 1.9. Czy Twoje modele dynamiczne mogą być refaktoryzowane, aby móc korzystać z contenttypes framework?

+0

To był ratownik, dzięki! – arctelix

+0

Przychodzi dla mnie na Django 1.11.5. Django nadal próbuje utworzyć tabelę django_migrations w starszej bazie danych zawierającej tabelę niezarządzaną. – user1255933

1

Prawdopodobnie można zapisać niestandardowy router bazy danych metodą allow_migrate, zwracając False dla modeli dynamicznych. Komenda migrate uniemożliwi im w takim przypadku.

Dopóki nie wczytujesz tych modeli dynamicznych do żadnego z modułów models.py, nie należy ich także odbierać makemigrations.

+1

Cóż, to daje mi coś bliżej, ale nie do końca. Po uruchomieniu komendy makemigrations modele dynamiczne są nadal widoczne i tworzone są dla nich migracje. Nie uruchamia jednak migracji dla tych tabel/modeli. Ideałem byłoby coś takiego jak metoda "allow_makemigrations", którą również mógłbym zastąpić. – chadgh

2

Proponuję zastąpić wygenerowaną operację migrations.CreateModel przez jedną z własnych, która zawsze odzwierciedla rzeczywisty stan modelu. W ten sposób nie można wykryć żadnych zmian stanu.

class CreateDynamicModel(CreateModel): 
    def __init__(self): 
     # ... dynamically generate the name, fields, options and bases 
     super(CreateDynamicModel, self).super(
      name=name, fields=fields, options=optins, bases=bases 
     ) 
Powiązane problemy