升级Django 1.5至1.7时遭遇AppRegistryNotReady错误求助
AppRegistryNotReady: Models aren't loaded yet错误 Hey there, sorry to hear you're hitting this frustrating error while upgrading your Django app. This is one of the most common gotchas when moving to Django 1.7, thanks to the new AppRegistry system that changed how models are loaded. Let's walk through the most likely fixes and troubleshooting steps based on what you've shared.
First, understand the root cause
Django 1.7 introduced a centralized app registry that loads models lazily and in a specific order. In 1.5, models were loaded immediately when modules were imported, but 1.7 waits until the registry is fully ready before allowing model access. Any code that tries to access models before the registry is initialized (like at the module level, in middleware __init__ methods, or in AppConfig ready() hooks done incorrectly) will trigger this error.
Troubleshooting steps based on your setup
1. Fix your WSGI configuration
Looking at your wsgi.py snippet, it seems incomplete and missing the critical step to initialize the Django app registry. A proper Django 1.7+ wsgi.py should look like this:
import os import sys # Add your project root to the path if needed PROJECT_ROOT = os.path.dirname(__file__) sys.path.insert(0, os.path.join(PROJECT_ROOT, '..')) from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings") # This line initializes the app registry properly application = get_wsgi_application()
If you're skipping get_wsgi_application() and manually importing project modules, that's almost certainly triggering the error early.
2. Audit your INSTALLED_APPS AppConfig classes
You're using the new AppConfig syntax (e.g., account.apps.AccountConfig) which is correct for 1.7, but double-check your custom AppConfig implementations:
- Ensure each AppConfig in
apps.pycorrectly sets thenameattribute to match your app's name:# account/apps.py from django.apps import AppConfig class AccountConfig(AppConfig): name = 'account' # Must match the app's directory name verbose_name = 'User Accounts' - Avoid putting model access logic directly in the
ready()method of your AppConfig. If you need to run code when the app is ready (like signal registration), usedjango.apps.apps.get_model()instead of direct imports:def ready(self): # Bad: Direct import triggers model load too early # from .models import User # Good: Lazy load the model User = self.get_model('User') # Or use the global registry # from django.apps import apps # User = apps.get_model('account.User')
3. Hunt down module-level model access
This is the #1 cause of this error. Search your entire project for code that accesses models at the top level of a module (not inside a function or method). For example:
- Bad:
# views.py from .models import Post # Module-level query runs before app registry is ready latest_posts = Post.objects.order_by('-date')[:5] - Fix: Move the logic inside a function so it runs only when needed:
Or use lazy model loading with the app registry:# views.py def get_latest_posts(): from .models import Post return Post.objects.order_by('-date')[:5]from django.apps import apps def get_latest_posts(): Post = apps.get_model('blog.Post') return Post.objects.order_by('-date')[:5]
4. Check middleware and third-party apps
- Custom middleware: If your middleware has logic in its
__init__method that accesses models, move that code toprocess_request()or another request-specific method—__init__runs when the server starts, before models are loaded. - Third-party packages: Verify that all your installed packages support Django 1.7. Old packages might rely on the pre-1.7 model loading behavior. Upgrade any outdated packages, or check their documentation for Django 1.7 compatibility fixes.
5. Verify your manage.py setup
Make sure your manage.py is using the 1.7+ initialization flow:
#!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project.settings") from django.core.management import execute_from_command_line execute_from_command_line(sys.argv)
Avoid adding custom imports or logic before execute_from_command_line()—this will trigger early model loading.
If you're still stuck...
The most helpful piece of info here is the full error stack trace. It will show exactly which line of code is trying to access models prematurely. If you can share the actual stack trace (not just the placeholder), we can pinpoint the exact issue.
内容的提问来源于stack exchange,提问作者Akhi

