Django 1.7 zgłasza django.core.exceptions.AppRegistryNotReady: modele nie są jeszcze załadowane

166

To jest śledzenie w moim systemie Windows.

Traceback (most recent call last):
  File "D:\AMD\workspace\steelrumors\manage.py", line 9, in <module>
    django.setup()
  File "D:\AMD\Django\django-django-4c85a0d\django\__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "D:\AMD\Django\django-django-4c85a0d\django\apps\registry.py", line 108, in populate
    app_config.import_models(all_models)
  File "D:\AMD\Django\django-django-4c85a0d\django\apps\config.py", line 197, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module
    __import__(name)
  File "C:\Python27\lib\site-packages\registration\models.py", line 15, in <module>
    User = get_user_model()
  File "D:\AMD\Django\django-django-4c85a0d\django\contrib\auth\__init__.py", line 135, in get_user_model
    return django_apps.get_model(settings.AUTH_USER_MODEL)
  File "D:\AMD\Django\django-django-4c85a0d\django\apps\registry.py", line 199, in get_model
    self.check_models_ready()
  File "D:\AMD\Django\django-django-4c85a0d\django\apps\registry.py", line 131, in check_models_ready
    raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

A mój manage.py wygląda tak:

import os
import sys
import django

if __name__ == "__main__":

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "steelrumors.settings")
    django.setup()
    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Otrzymuję ten błąd, gdy próbuję użyć aplikacji rejestracyjnej w Django 1.7

doubleo
źródło
1
Masz katalog o nazwie django-django-4c85a0d; 4c85a0dtak się składa, że ​​jest (niestabilnym) hashem zatwierdzenia Django. Nie wierzę, że faktycznie używasz Django 1.7 (patrz moja odpowiedź)
Kristian Glass
Czy kiedykolwiek rozwiązałeś swój problem?
Nick Spacek,
Może to również dotyczyć venv. Odtworzenie katalogu venv naprawiło to za mnie. `` `` mv venv venv_old virtualenv venv source ./venv/bin/activate pip install -r Requirements.txt ''
Thomas - BeeDesk
1
Spotykam się również z takim błędem, gdy dodaję LOGOWANIE w settings.py na moim Macu, ponieważ tworzę plik dziennika w /var/log/xx/debug.log i nie mam pozwolenia, więc używam sudo do runserver, a wszystko jest fine.May pomaga niektórzy geje
gkiwi
Widziałem ten błąd podczas pracy docker-compose exec .... Problem polegał na tym, że nie przekazywałem wymaganych zmiennych środowiskowych do polecenia docker-compose exec .
Matthew Hegarty

Odpowiedzi:

59

Oto, co rozwiązało problem dla nas i dla tych ludzi :

Nasz projekt rozpoczął się od Django 1.4, przeszliśmy do wersji 1.5, a następnie 1.7. Nasz wsgi.py wyglądał tak:

import os

from django.core.handlers.wsgi import WSGIHandler

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = WSGIHandler()

Kiedy zaktualizowałem do obsługi WSGI w stylu 1.7:

import os

from django.core.wsgi import get_wsgi_application

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = get_wsgi_application()

Teraz wszystko działa.

Nick Spacek
źródło
1
Nie zgadzam się z edycją z @wim, nie dlatego, że uważam, że powinniśmy zostawić niepotrzebny import, ale dlatego, że podałem przykład, jak wcześniej wyglądał autogenerowany wsgi.py i jak wyglądał po skopiowaniu różnice w stosunku do automatycznie generowanego pliku wsgi.py w wersji 1.7.
Nick Spacek,
1
Plik wygenerowany automatycznie wsgi.pynigdy nie zawiera pliku import sys. Nie w 1.4, nie w 1.5 i nie w 1.7. Jeśli miałeś to tam, to zostało dodane ręcznie przez kogoś - nie jest dodawane przez django-admin startproject.
wim
Dobrze wiedzieć, mój błąd (i słaba pamięć). Minęło trochę czasu, odkąd to zrobiłem, ale byłem prawie pewien, że w tym czasie próbowałem udokumentować wbudowane zachowanie.
Nick Spacek,
236

Uruchomienie tych poleceń rozwiązało mój problem (dzięki tej odpowiedzi ):

import django
django.setup()

Jednak nie jestem pewien, dlaczego tego potrzebuję. Będziemy wdzięczni za komentarze.

Nimo
źródło
12
Przepraszam, tylko papuguję to, co przeczytałem w informacjach o wydaniu django 1.7 o wprowadzaniu zmian. docs.djangoproject.com/en/dev/releases/1.7/… . Zasadniczo Django ma nowy sposób ładowania zainstalowanej aplikacji. Jeśli ładujesz Django ze skryptu Pythona (tak jak robiłem to w moich niestandardowych testach jednostkowych), przed kontynuowaniem należy wykonać pewną inicjalizację, a wywołanie setup () jest jak to zrobić. Poza tym, chwała zespołowi, moja aktualizacja z wersji 1.6.2 do 1.7.1 wydaje się warta godziny prawdziwej pracy.
JL Peyret
12
Gdzie mam uruchomić powyższe polecenie? Dodam to do pliku .py czy co?
KhoPhi
1
Powinieneś uruchomić to w tym samym kontekście, w którym występuje błąd
Nimo
3
to wystarcza liczba głosów pozytywnych, aby oznaczyć poprawną odpowiedź
acid_crucifix
Rozwiązało to również problem, który miałem w skrypcie aktualizacji wiersza poleceń, który zepsuł się podczas przechodzenia do wersji 1.7.
Jason Champion,
58

Problem dotyczy Twojej aplikacji rejestracyjnej. Wydaje wywołań django rejestracji get_user_module()w models.pyna poziomie modułu (gdy modele wciąż są ładowane przez proces rejestracji wniosku). To już nie będzie działać:

try:
    from django.contrib.auth import get_user_model
    User = get_user_model()
except ImportError:
    from django.contrib.auth.models import User    

get_user_model()Zmieniłbym ten plik modeli, aby wywoływał tylko metody wewnętrzne (a nie na poziomie modułu), aw SK używam czegoś takiego:

user = ForeignKey(settings.AUTH_USER_MODEL)

Przy okazji, wywołanie do django.setup()nie powinno być wymagane w manage.pypliku, jest wzywane do Ciebie execute_from_command_line. ( źródło )

gonz
źródło
włożenie go do środka if __name__ == '__main__':działa dla mnie, ale nie wiem, czy to dobre rozwiązanie.
Umair A.
@Neutralizer Nie jestem pewien, jak to robisz, ale to nie powinno działać, ponieważ django importuje ten moduł. Prawdopodobnie unikasz cyklicznego składowania, w ogóle nie importując modelu użytkownika.
gonz
1
Mam na myśli, umieść te wiersze w polu nazwy. Może to być pominięcie wykonania. Nie wykonałem wystarczającej liczby testów.
Umair A.
18

Właśnie napotkałem ten sam problem. Problem wynika z django-registrationniezgodności z modelem użytkownika django 1.7.

Prostą poprawką jest zmiana tych wierszy kodu w zainstalowanym django-registrationmodule:

try:
    from django.contrib.auth import get_user_model
    User = get_user_model()
except ImportError:
    from django.contrib.auth.models import User  

do::

from django.conf import settings
try:
    from django.contrib.auth import get_user_model
    User = settings.AUTH_USER_MODEL
except ImportError:
    from django.contrib.auth.models import User 

Mój jest w .venv/local/lib/python2.7/site-packages/registration/models.py(virtualenv)

pozdrowienia
źródło
7
Zamiast tego możesz użyć django-registration-redux. Zaktualizowany i utrzymywany widelec: github.com/macropin/django-registration
TJL
1
django-registration-reduxnaprawiono problem dla mnie (miałem dokładnie taki sam stack jak OP)
Pierre de LESPINAY
1
Na wypadek, gdyby ktoś zmagał się z tym w Django 1.8, ma to również zastosowanie.
Andrew Schuster,
14

To działa dla mnie dla Django 1.9. Skrypt Pythona do wykonania znajdował się w katalogu głównym projektu Django.

    import django 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_NAME.settings")
    django.setup()
    from APP_NAME.models import *

Ustaw PROJECT_NAME i APP_NAME jako swoje

Lorenzo Lerate
źródło
1
Mi to pasuje. ale nie wiem, dlaczego powinniśmy uruchamiać ten kod, ponieważ wspomnieliśmy już o tym w naszym pliku wsgi.
Mr Code
5

Inną opcją jest to, że masz zduplikowany wpis w INSTALLED_APPS. To spowodowało ten błąd dla dwóch różnych aplikacji, które testowałem. Najwyraźniej nie jest to coś, czego Django szuka, ale kto jest na tyle głupi, aby dwukrotnie umieścić tę samą aplikację na liście. Ja, to kto.

znak
źródło
2

Czy masz środowisko wirtualne Python, do którego musisz wejść przed uruchomieniem manage.py?

Sam napotkałem ten błąd i to był problem.

Travis
źródło
2

Napotkałem ten problem, gdy używam djangocms i dodałem wtyczkę (w moim przypadku: djangocms-cascade). Oczywiście musiałem dodać wtyczkę do INSTALLED_APPS. Ale kolejność jest tutaj ważna.

Umieszczenie „cmsplugin_cascade” przed „cms” rozwiązało problem.

pabo
źródło
1
kolejność miała znaczenie:cms, mptt, menus, sekizai, filer, easy_thumbnails
blakev
2

zainstaluj django-registration-redux == 1.1 zamiast django-registration, jeśli używasz django 1.7

user2350206
źródło
0

./manage.py migrate

To rozwiązało mój problem

Omar Natour
źródło
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, zostaw komentarz pod jego postem. - Z recenzji
George Z.
@GeorgeZ. Wygląda na to, że jest próbą odpowiedzi na pytanie i najwyraźniej rozwiązał problem, gdy ten plakat się z nim
spotkał
-1

Twój manage.pyjest „zły”; Nie wiem, skąd go masz, ale to nie jest 1.7manage.py - czy używałeś jakiejś funky przedpremierowej kompilacji czy coś?

Zresetuj manage.pydo konwencjonalnych, jak poniżej, i rzeczy powinny po prostu działać:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)
Kristian Glass
źródło
Mam taki manage.py i nadal mam ten problem
rmosolgo