2015-05-15 12 views
17

Kiedy uruchomić testy otrzymuję ten błąd podczas inicjalizacji bazy danych:InvalidBasesError: Nie można rozwiązać podstaw [<ModelState: „users.GroupProxy”]

django.db.migrations.state.InvalidBasesError: Cannot resolve bases for [<ModelState: 'users.GroupProxy'>] 
This can happen if you are inheriting models from an app with migrations (e.g. contrib.auth) 

Stworzyłem ten proxy dla modelu contrib.auth do Grupy umieść go w mojej aplikacji w django admin:

class GroupProxy(Group): 
    class Meta: 
     proxy = True 
     verbose_name = Group._meta.verbose_name 
     verbose_name_plural = Group._meta.verbose_name_plural 

Co mogę zrobić, aby rozwiązać ten problem?

+0

@Dimitry Mikhaylov rozwiązałeś ten problem? Mam także do czynienia z dokładnie tym samym błędem dla ustawionego proxy. Byłbym szczęśliwy, gdybyś mógł mi pomóc. – SpiXel

+0

Musiałem uruchomić migracje dla 'contrib.auth' wcześniej, to nie działało inaczej. –

+3

Może być konieczne utworzenie folderu migracji z pustym __init__.py w nim, więc Django może faktycznie utworzyć plik migracji. Zobacz odpowiedź Tamriel http://stackoverflow.com/questions/27261030/migration-error-with-django-1-7-1 – Jesuisme

Odpowiedz

16

Po dużo kopania na tej jedynej rzeczy, która pracowała dla mnie było

comment out the offending apps, run migrations, then add them in again.

Tylko obejście, ale miejmy nadzieję, że ktoś pomaga.

6

Czy próbowałeś już uruchomić aplikację manage.py makemigrations <app_label> przed uruchomieniem testów?

Sprawdź także, czy aplikacja, której model (y) próbujesz ustawić jako Proxy, znajduje się w pliku INSTALLED_APPS.

+0

po uruchomieniu 'python manage.py test' spróbuje utworzyć testową bazę danych i zastosować wszystkie migracje przed uruchomieniem testów. –

+0

Mam już bazę danych, ale brakowało plików migracji. Po zrobieniu tego ('makemigrations ') otrzymałem błędy, że tabela 'nazwa_aplikacji.model_name już istnieje. 'Rozwiązałem to przez edycję pliku migracji (' app/migrations/0001_initial.py') i komentowanie każdej linii w 'operations = [...]' list. – Keith

0

Jeśli dzieje się tak tylko przy uruchomieniu python manage.py test (być może dlatego, że dokonano już niezbędnych migracji), należy jednoznacznie stwierdzić, że contrib.auth nie powinien migrować do MIGRATION_MODULES modułu ustawień.

MIGRATION_MODULES(
     'auth': "contrib.auth.migrations_not_used_in_tests", 
) 
10

Natknąłem tego problemu i jak zakomentowanie model naprawdę nie jest rozwiązaniem, Znalazłem, że ustawienie nieudokumentowane auto_created = True do Meta klasy uczyni Django zignorować.

class GroupProxy(Group): 

    class Meta: 
     proxy = True 
     auto_created = True 
+0

To spowoduje problemy podczas tworzenia uprawnień dla tych aplikacji, więc używaj go ostrożnie. – XelharK

+0

Nie działa w ogóle. –

0

Miałem ten problem po zmianie nazwy tabeli nadrzędnej grupy moich modeli proxy. Rozwiązałem go przez:

  1. Usuń plik migracji, którego nazwa zmieniła się dla tabeli nadrzędnej.
  2. Używając terminalu Postgres, zmieniłem nazwę tabeli nadrzędnej na jej poprzednią nazwę.
  3. Ran makemigrations i migrate ponownie
4

prostu stworzenie katalogu w katalogu głównym aplikacji migrations (tak users/migrations/ w twoim przypadku) i dodanie pustego __init__.py plik może rozwiązać problem. Przynajmniej zrobiło to dla mnie, gdy robiłem ten sam błąd.

Ale lepiej dla Ciebie uruchomić aplikację makemigrations, zgodnie z sugestią podaną powyżej przez @nie. To utworzy katalog dla ciebie ORAZ wygeneruje migracje dla twoich modeli proxy.

Why does Django create migration files for proxy models?

Twoje testy szukasz tych wędrówek i nie są ich znalezieniem.

1

Też stawiłem czoła temu problemowi (po zrobieniu jakiegoś złożonego dziedziczenia modelu).Jeden z moich wędrówek zawierało

migrations.CreateModel(
    name='Offer', 
    fields=[ 
     # ... 
    ], 
    options={ 
     # ... 
    }, 
    bases=('shop.entity',), 
), 

Usunąłem shop.Entity modelu całkowicie, ale migracja została przedstawieniu go w atrybucie bases. Właśnie usunąłem bases=('shop.entity',) i to działa. Prawdopodobnie przerwie to możliwość migracji od samego początku, ale przynajmniej pozwoli na dalszą migrację.

Kolejna porada to: przejdź bezpośrednio do kodu django i sprawdź, co powoduje problemy "bazowe". Idź do django/db/migrations/state.py i dodać punkt przerwania:

try: 
    bases = tuple(
     (apps.get_model(base) if isinstance(base, six.string_types) else base) 
     for base in self.bases 
    ) 
except LookupError: 
    print(self.bases) # <-- print the bases 
    import ipdb; ipdb.set_trace() # <-- debug here 
    raise InvalidBasesError("Cannot resolve one or more bases from %r" % (self.bases,)) 
0

Spędził większość popołudnia próbuje rozwiązać ten błąd się, przechodząc przez każdy wyobrażalny mieszaniny „zakomentowanie aplikacje”, „upuszczanie tabel” i upuszczanie całych baz danych I odkryłem, że mój problem spowodowany był prostym brakiem folderu "migracje" i pliku __ init__.py wewnątrz wspomnianego folderu.

Jedna ze starszych odpowiedzi, która była poprawna, nie jest już poprawna, ponieważ naprawiono problem wymieniony na here.

Sprawdź każdy katalog zawierający model wymieniony w 'init.py' i powinien zniknąć.

Prawdopodobnie nie rozwiąże sprawy wszystkich, ale pomógł mi.

Powiązane problemy