summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/apps/__init__.py1
-rw-r--r--django/apps/cache.py19
-rw-r--r--django/contrib/admin/validation.py3
-rw-r--r--django/contrib/admindocs/views.py7
-rw-r--r--django/contrib/auth/__init__.py4
-rw-r--r--django/contrib/auth/management/__init__.py9
-rw-r--r--django/contrib/auth/tests/test_management.py8
-rw-r--r--django/contrib/comments/views/comments.py3
-rw-r--r--django/contrib/contenttypes/management.py9
-rw-r--r--django/contrib/contenttypes/models.py3
-rw-r--r--django/contrib/gis/sitemaps/kml.py3
-rw-r--r--django/contrib/gis/sitemaps/views.py4
-rw-r--r--django/core/checks/compatibility/django_1_6_0.py3
-rw-r--r--django/core/management/base.py4
-rw-r--r--django/core/management/commands/dumpdata.py20
-rw-r--r--django/core/management/commands/flush.py5
-rw-r--r--django/core/management/commands/loaddata.py4
-rw-r--r--django/core/management/commands/makemigrations.py6
-rw-r--r--django/core/management/commands/migrate.py8
-rw-r--r--django/core/management/commands/shell.py4
-rw-r--r--django/core/management/commands/sqlsequencereset.py5
-rw-r--r--django/core/management/sql.py9
-rw-r--r--django/core/management/validation.py14
-rw-r--r--django/core/serializers/base.py3
-rw-r--r--django/core/serializers/python.py5
-rw-r--r--django/core/serializers/xml_serializer.py3
-rw-r--r--django/db/backends/__init__.py13
-rw-r--r--django/db/migrations/loader.py9
-rw-r--r--django/db/migrations/questioner.py4
-rw-r--r--django/db/migrations/writer.py14
-rw-r--r--django/db/models/__init__.py3
-rw-r--r--django/db/models/base.py5
-rw-r--r--django/db/models/fields/__init__.py4
-rw-r--r--django/db/models/loading.py24
-rw-r--r--django/db/models/options.py8
-rw-r--r--django/db/models/signals.py4
-rw-r--r--django/db/utils.py4
-rw-r--r--django/test/simple.py8
-rw-r--r--django/test/testcases.py8
-rw-r--r--tests/app_cache/tests.py11
-rw-r--r--tests/app_loading/tests.py33
-rw-r--r--tests/commands_sql/tests.py15
-rw-r--r--tests/defer_regress/tests.py14
-rw-r--r--tests/empty/tests.py4
-rw-r--r--tests/invalid_models/tests.py10
-rw-r--r--tests/managers_regress/tests.py14
-rw-r--r--tests/migrations/test_commands.py12
-rw-r--r--tests/migrations/test_operations.py5
-rw-r--r--tests/migrations/test_writer.py4
-rw-r--r--tests/proxy_model_inheritance/tests.py16
-rw-r--r--tests/proxy_models/tests.py6
-rwxr-xr-xtests/runtests.py10
-rw-r--r--tests/swappable_models/tests.py6
-rw-r--r--tests/tablespaces/tests.py8
-rw-r--r--tests/test_suite_override/tests.py4
55 files changed, 226 insertions, 220 deletions
diff --git a/django/apps/__init__.py b/django/apps/__init__.py
index e69de29bb2..0384b1257d 100644
--- a/django/apps/__init__.py
+++ b/django/apps/__init__.py
@@ -0,0 +1 @@
+from .cache import app_cache, UnavailableApp # NOQA
diff --git a/django/apps/cache.py b/django/apps/cache.py
index 8afe3dd4cf..b5fd1c37da 100644
--- a/django/apps/cache.py
+++ b/django/apps/cache.py
@@ -12,8 +12,6 @@ from django.utils.module_loading import module_has_submodule
from django.utils._os import upath
from django.utils import six
-__all__ = ('get_apps', 'get_app', 'get_models', 'get_model', 'register_models',
- 'load_app', 'app_cache_ready')
MODELS_MODULE_NAME = 'models'
@@ -361,19 +359,4 @@ class AppCache(BaseAppCache):
self.__dict__ = self.__shared_state
-cache = AppCache()
-
-
-# These methods were always module level, so are kept that way for backwards
-# compatibility.
-get_apps = cache.get_apps
-get_app_package = cache.get_app_package
-get_app_path = cache.get_app_path
-get_app_paths = cache.get_app_paths
-get_app = cache.get_app
-get_app_errors = cache.get_app_errors
-get_models = cache.get_models
-get_model = cache.get_model
-register_models = cache.register_models
-load_app = cache.load_app
-app_cache_ready = cache.app_cache_ready
+app_cache = AppCache()
diff --git a/django/contrib/admin/validation.py b/django/contrib/admin/validation.py
index 9079678639..c8bd4af120 100644
--- a/django/contrib/admin/validation.py
+++ b/django/contrib/admin/validation.py
@@ -1,3 +1,4 @@
+from django.apps import app_cache
from django.core.exceptions import ImproperlyConfigured
from django.db import models
from django.db.models.fields import FieldDoesNotExist
@@ -17,7 +18,7 @@ class BaseValidator(object):
def __init__(self):
# Before we can introspect models, they need to be fully loaded so that
# inter-relations are set up correctly. We force that here.
- models.get_apps()
+ app_cache.get_apps()
def validate(self, cls, model):
for m in dir(self):
diff --git a/django/contrib/admindocs/views.py b/django/contrib/admindocs/views.py
index 482d33e76f..e1edf0aad8 100644
--- a/django/contrib/admindocs/views.py
+++ b/django/contrib/admindocs/views.py
@@ -4,6 +4,7 @@ import os
import re
from django import template
+from django.apps import app_cache
from django.conf import settings
from django.contrib import admin
from django.contrib.admin.views.decorators import staff_member_required
@@ -182,7 +183,7 @@ class ModelIndexView(BaseAdminDocsView):
template_name = 'admin_doc/model_index.html'
def get_context_data(self, **kwargs):
- m_list = [m._meta for m in models.get_models()]
+ m_list = [m._meta for m in app_cache.get_models()]
kwargs.update({'models': m_list})
return super(ModelIndexView, self).get_context_data(**kwargs)
@@ -193,11 +194,11 @@ class ModelDetailView(BaseAdminDocsView):
def get_context_data(self, **kwargs):
# Get the model class.
try:
- app_mod = models.get_app(self.kwargs['app_label'])
+ app_mod = app_cache.get_app(self.kwargs['app_label'])
except ImproperlyConfigured:
raise Http404(_("App %r not found") % self.kwargs['app_label'])
model = None
- for m in models.get_models(app_mod):
+ for m in app_cache.get_models(app_mod):
if m._meta.model_name == self.kwargs['model_name']:
model = m
break
diff --git a/django/contrib/auth/__init__.py b/django/contrib/auth/__init__.py
index 83aa445bac..3c5a40c184 100644
--- a/django/contrib/auth/__init__.py
+++ b/django/contrib/auth/__init__.py
@@ -123,13 +123,13 @@ def get_user_model():
"""
Returns the User model that is active in this project.
"""
- from django.db.models import get_model
+ from django.apps import app_cache
try:
app_label, model_name = settings.AUTH_USER_MODEL.split('.')
except ValueError:
raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
- user_model = get_model(app_label, model_name)
+ user_model = app_cache.get_model(app_label, model_name)
if user_model is None:
raise ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL)
return user_model
diff --git a/django/contrib/auth/management/__init__.py b/django/contrib/auth/management/__init__.py
index 8fd08ac57c..5f24bf069e 100644
--- a/django/contrib/auth/management/__init__.py
+++ b/django/contrib/auth/management/__init__.py
@@ -6,12 +6,13 @@ from __future__ import unicode_literals
import getpass
import unicodedata
+from django.apps import app_cache, UnavailableApp
from django.contrib.auth import (models as auth_app, get_permission_codename,
get_user_model)
from django.core import exceptions
from django.core.management.base import CommandError
from django.db import DEFAULT_DB_ALIAS, router
-from django.db.models import get_model, get_models, signals, UnavailableApp
+from django.db.models import signals
from django.utils.encoding import DEFAULT_LOCALE_ENCODING
from django.utils import six
from django.utils.six.moves import input
@@ -61,7 +62,7 @@ def _check_permission_clashing(custom, builtin, ctype):
def create_permissions(app, created_models, verbosity, db=DEFAULT_DB_ALIAS, **kwargs):
try:
- get_model('auth', 'Permission')
+ app_cache.get_model('auth', 'Permission')
except UnavailableApp:
return
@@ -70,7 +71,7 @@ def create_permissions(app, created_models, verbosity, db=DEFAULT_DB_ALIAS, **kw
from django.contrib.contenttypes.models import ContentType
- app_models = get_models(app)
+ app_models = app_cache.get_models(app)
# This will hold the permissions we're looking for as
# (content_type, (codename, name))
@@ -119,7 +120,7 @@ def create_permissions(app, created_models, verbosity, db=DEFAULT_DB_ALIAS, **kw
def create_superuser(app, created_models, verbosity, db, **kwargs):
try:
- get_model('auth', 'Permission')
+ app_cache.get_model('auth', 'Permission')
UserModel = get_user_model()
except UnavailableApp:
return
diff --git a/django/contrib/auth/tests/test_management.py b/django/contrib/auth/tests/test_management.py
index 698947d57c..43ad15dcab 100644
--- a/django/contrib/auth/tests/test_management.py
+++ b/django/contrib/auth/tests/test_management.py
@@ -1,7 +1,7 @@
from __future__ import unicode_literals
from datetime import date
-from django.apps.cache import get_app
+from django.apps import app_cache
from django.contrib.auth import models, management
from django.contrib.auth.management import create_permissions
from django.contrib.auth.management.commands import changepassword
@@ -184,21 +184,21 @@ class CustomUserModelValidationTestCase(TestCase):
def test_required_fields_is_list(self):
"REQUIRED_FIELDS should be a list."
new_io = StringIO()
- get_validation_errors(new_io, get_app('auth'))
+ get_validation_errors(new_io, app_cache.get_app('auth'))
self.assertIn("The REQUIRED_FIELDS must be a list or tuple.", new_io.getvalue())
@override_settings(AUTH_USER_MODEL='auth.CustomUserBadRequiredFields')
def test_username_not_in_required_fields(self):
"USERNAME_FIELD should not appear in REQUIRED_FIELDS."
new_io = StringIO()
- get_validation_errors(new_io, get_app('auth'))
+ get_validation_errors(new_io, app_cache.get_app('auth'))
self.assertIn("The field named as the USERNAME_FIELD should not be included in REQUIRED_FIELDS on a swappable User model.", new_io.getvalue())
@override_settings(AUTH_USER_MODEL='auth.CustomUserNonUniqueUsername')
def test_username_non_unique(self):
"A non-unique USERNAME_FIELD should raise a model validation error."
new_io = StringIO()
- get_validation_errors(new_io, get_app('auth'))
+ get_validation_errors(new_io, app_cache.get_app('auth'))
self.assertIn("The USERNAME_FIELD must be unique. Add unique=True to the field parameters.", new_io.getvalue())
diff --git a/django/contrib/comments/views/comments.py b/django/contrib/comments/views/comments.py
index a2cbe33c0e..5d7c543adb 100644
--- a/django/contrib/comments/views/comments.py
+++ b/django/contrib/comments/views/comments.py
@@ -1,4 +1,5 @@
from django import http
+from django.apps import app_cache
from django.conf import settings
from django.contrib import comments
from django.contrib.comments import signals
@@ -48,7 +49,7 @@ def post_comment(request, next=None, using=None):
if ctype is None or object_pk is None:
return CommentPostBadRequest("Missing content_type or object_pk field.")
try:
- model = models.get_model(*ctype.split(".", 1))
+ model = app_cache.get_model(*ctype.split(".", 1))
target = model._default_manager.using(using).get(pk=object_pk)
except TypeError:
return CommentPostBadRequest(
diff --git a/django/contrib/contenttypes/management.py b/django/contrib/contenttypes/management.py
index 3d2fc4b95e..477464c37e 100644
--- a/django/contrib/contenttypes/management.py
+++ b/django/contrib/contenttypes/management.py
@@ -1,6 +1,7 @@
+from django.apps import app_cache, UnavailableApp
from django.contrib.contenttypes.models import ContentType
from django.db import DEFAULT_DB_ALIAS, router
-from django.db.models import get_apps, get_model, get_models, signals, UnavailableApp
+from django.db.models import signals
from django.utils.encoding import smart_text
from django.utils import six
from django.utils.six.moves import input
@@ -12,7 +13,7 @@ def update_contenttypes(app, created_models, verbosity=2, db=DEFAULT_DB_ALIAS, *
entries that no longer have a matching model class.
"""
try:
- get_model('contenttypes', 'ContentType')
+ app_cache.get_model('contenttypes', 'ContentType')
except UnavailableApp:
return
@@ -20,7 +21,7 @@ def update_contenttypes(app, created_models, verbosity=2, db=DEFAULT_DB_ALIAS, *
return
ContentType.objects.clear_cache()
- app_models = get_models(app)
+ app_models = app_cache.get_models(app)
if not app_models:
return
# They all have the same app_label, get the first one.
@@ -85,7 +86,7 @@ If you're unsure, answer 'no'.
def update_all_contenttypes(verbosity=2, **kwargs):
- for app in get_apps():
+ for app in app_cache.get_apps():
update_contenttypes(app, None, verbosity, **kwargs)
signals.post_migrate.connect(update_contenttypes)
diff --git a/django/contrib/contenttypes/models.py b/django/contrib/contenttypes/models.py
index aec15d6664..90dea5b811 100644
--- a/django/contrib/contenttypes/models.py
+++ b/django/contrib/contenttypes/models.py
@@ -1,3 +1,4 @@
+from django.apps import app_cache
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_text, force_text
@@ -156,7 +157,7 @@ class ContentType(models.Model):
def model_class(self):
"Returns the Python model class for this type of content."
- return models.get_model(self.app_label, self.model,
+ return app_cache.get_model(self.app_label, self.model,
only_installed=False)
def get_object_for_this_type(self, **kwargs):
diff --git a/django/contrib/gis/sitemaps/kml.py b/django/contrib/gis/sitemaps/kml.py
index 5e74c6c47d..1e4fc82550 100644
--- a/django/contrib/gis/sitemaps/kml.py
+++ b/django/contrib/gis/sitemaps/kml.py
@@ -1,3 +1,4 @@
+from django.apps import app_cache
from django.core import urlresolvers
from django.contrib.sitemaps import Sitemap
from django.contrib.gis.db.models.fields import GeometryField
@@ -25,7 +26,7 @@ class KMLSitemap(Sitemap):
"""
kml_sources = []
if sources is None:
- sources = models.get_models()
+ sources = app_cache.get_models()
for source in sources:
if isinstance(source, models.base.ModelBase):
for field in source._meta.fields:
diff --git a/django/contrib/gis/sitemaps/views.py b/django/contrib/gis/sitemaps/views.py
index 0672b800cc..e68523981e 100644
--- a/django/contrib/gis/sitemaps/views.py
+++ b/django/contrib/gis/sitemaps/views.py
@@ -2,6 +2,7 @@ from __future__ import unicode_literals
import warnings
+from django.apps import app_cache
from django.http import HttpResponse, Http404
from django.template import loader
from django.contrib.sites.models import get_current_site
@@ -9,7 +10,6 @@ from django.core import urlresolvers
from django.core.paginator import EmptyPage, PageNotAnInteger
from django.contrib.gis.db.models.fields import GeometryField
from django.db import connections, DEFAULT_DB_ALIAS
-from django.db.models import get_model
from django.db.models.fields import FieldDoesNotExist
from django.utils import six
from django.utils.translation import ugettext as _
@@ -81,7 +81,7 @@ def kml(request, label, model, field_name=None, compress=False, using=DEFAULT_DB
must be that of a geographic field.
"""
placemarks = []
- klass = get_model(label, model)
+ klass = app_cache.get_model(label, model)
if not klass:
raise Http404('You must supply a valid app label and module name. Got "%s.%s"' % (label, model))
diff --git a/django/core/checks/compatibility/django_1_6_0.py b/django/core/checks/compatibility/django_1_6_0.py
index a00196f2c0..a42249de60 100644
--- a/django/core/checks/compatibility/django_1_6_0.py
+++ b/django/core/checks/compatibility/django_1_6_0.py
@@ -1,5 +1,6 @@
from __future__ import unicode_literals
+from django.apps import app_cache
from django.db import models
@@ -31,7 +32,7 @@ def check_boolean_field_default_value():
warns the user that the default has changed from False to Null.
"""
fields = []
- for cls in models.get_models():
+ for cls in app_cache.get_models():
opts = cls._meta
for f in opts.local_fields:
if isinstance(f, models.BooleanField) and not f.has_default():
diff --git a/django/core/management/base.py b/django/core/management/base.py
index ef967d021f..d749bc2e8e 100644
--- a/django/core/management/base.py
+++ b/django/core/management/base.py
@@ -342,11 +342,11 @@ class AppCommand(BaseCommand):
args = '<appname appname ...>'
def handle(self, *app_labels, **options):
- from django.db import models
+ from django.apps import app_cache
if not app_labels:
raise CommandError('Enter at least one appname.')
try:
- app_list = [models.get_app(app_label) for app_label in app_labels]
+ app_list = [app_cache.get_app(app_label) for app_label in app_labels]
except (ImproperlyConfigured, ImportError) as e:
raise CommandError("%s. Are you sure your INSTALLED_APPS setting is correct?" % e)
output = []
diff --git a/django/core/management/commands/dumpdata.py b/django/core/management/commands/dumpdata.py
index 85817e9194..4f87b04003 100644
--- a/django/core/management/commands/dumpdata.py
+++ b/django/core/management/commands/dumpdata.py
@@ -38,7 +38,7 @@ class Command(BaseCommand):
args = '[appname appname.ModelName ...]'
def handle(self, *app_labels, **options):
- from django.db.models import get_app, get_apps, get_model
+ from django.apps import app_cache
format = options.get('format')
indent = options.get('indent')
@@ -64,13 +64,13 @@ class Command(BaseCommand):
for exclude in excludes:
if '.' in exclude:
app_label, model_name = exclude.split('.', 1)
- model_obj = get_model(app_label, model_name)
+ model_obj = app_cache.get_model(app_label, model_name)
if not model_obj:
raise CommandError('Unknown model in excludes: %s' % exclude)
excluded_models.add(model_obj)
else:
try:
- app_obj = get_app(exclude)
+ app_obj = app_cache.get_app(exclude)
excluded_apps.add(app_obj)
except ImproperlyConfigured:
raise CommandError('Unknown app in excludes: %s' % exclude)
@@ -78,7 +78,7 @@ class Command(BaseCommand):
if len(app_labels) == 0:
if primary_keys:
raise CommandError("You can only use --pks option with one model")
- app_list = OrderedDict((app, None) for app in get_apps() if app not in excluded_apps)
+ app_list = OrderedDict((app, None) for app in app_cache.get_apps() if app not in excluded_apps)
else:
if len(app_labels) > 1 and primary_keys:
raise CommandError("You can only use --pks option with one model")
@@ -87,12 +87,12 @@ class Command(BaseCommand):
try:
app_label, model_label = label.split('.')
try:
- app = get_app(app_label)
+ app = app_cache.get_app(app_label)
except ImproperlyConfigured:
raise CommandError("Unknown application: %s" % app_label)
if app in excluded_apps:
continue
- model = get_model(app_label, model_label)
+ model = app_cache.get_model(app_label, model_label)
if model is None:
raise CommandError("Unknown model: %s.%s" % (app_label, model_label))
@@ -107,7 +107,7 @@ class Command(BaseCommand):
# This is just an app - no model qualifier
app_label = label
try:
- app = get_app(app_label)
+ app = app_cache.get_app(app_label)
except ImproperlyConfigured:
raise CommandError("Unknown application: %s" % app_label)
if app in excluded_apps:
@@ -160,13 +160,13 @@ def sort_dependencies(app_list):
is serialized before a normal model, and any model with a natural key
dependency has it's dependencies serialized first.
"""
- from django.db.models import get_model, get_models
+ from django.apps import app_cache
# Process the list of models, and get the list of dependencies
model_dependencies = []
models = set()
for app, model_list in app_list:
if model_list is None:
- model_list = get_models(app)
+ model_list = app_cache.get_models(app)
for model in model_list:
models.add(model)
@@ -174,7 +174,7 @@ def sort_dependencies(app_list):
if hasattr(model, 'natural_key'):
deps = getattr(model.natural_key, 'dependencies', [])
if deps:
- deps = [get_model(*d.split('.')) for d in deps]
+ deps = [app_cache.get_model(*d.split('.')) for d in deps]
else:
deps = []
diff --git a/django/core/management/commands/flush.py b/django/core/management/commands/flush.py
index 130338a55a..f4b221a32c 100644
--- a/django/core/management/commands/flush.py
+++ b/django/core/management/commands/flush.py
@@ -2,8 +2,9 @@ import sys
from importlib import import_module
from optparse import make_option
+from django.apps import app_cache
from django.conf import settings
-from django.db import connections, router, transaction, models, DEFAULT_DB_ALIAS
+from django.db import connections, router, transaction, DEFAULT_DB_ALIAS
from django.core.management import call_command
from django.core.management.base import NoArgsCommand, CommandError
from django.core.management.color import no_style
@@ -93,6 +94,6 @@ Are you sure you want to do this?
# Emit the post migrate signal. This allows individual applications to
# respond as if the database had been migrated from scratch.
all_models = []
- for app in models.get_apps():
+ for app in app_cache.get_apps():
all_models.extend(router.get_migratable_models(app, database, include_auto_created=True))
emit_post_migrate_signal(set(all_models), verbosity, interactive, database)
diff --git a/django/core/management/commands/loaddata.py b/django/core/management/commands/loaddata.py
index 59c1343271..64a57fbc79 100644
--- a/django/core/management/commands/loaddata.py
+++ b/django/core/management/commands/loaddata.py
@@ -7,13 +7,13 @@ import warnings
import zipfile
from optparse import make_option
+from django.apps import app_cache
from django.conf import settings
from django.core import serializers
from django.core.management.base import BaseCommand, CommandError
from django.core.management.color import no_style
from django.db import (connections, router, transaction, DEFAULT_DB_ALIAS,
IntegrityError, DatabaseError)
-from django.db.models import get_app_paths
from django.utils import lru_cache
from django.utils.encoding import force_text
from django.utils.functional import cached_property
@@ -230,7 +230,7 @@ class Command(BaseCommand):
current directory.
"""
dirs = []
- for path in get_app_paths():
+ for path in app_cache.get_app_paths():
d = os.path.join(path, 'fixtures')
if os.path.isdir(d):
dirs.append(d)
diff --git a/django/core/management/commands/makemigrations.py b/django/core/management/commands/makemigrations.py
index 7c4bb4f7cf..cd891c404d 100644
--- a/django/core/management/commands/makemigrations.py
+++ b/django/core/management/commands/makemigrations.py
@@ -3,7 +3,7 @@ import os
import operator
from optparse import make_option
-from django.apps.cache import cache
+from django.apps import app_cache
from django.core.management.base import BaseCommand, CommandError
from django.core.exceptions import ImproperlyConfigured
from django.db import connections, DEFAULT_DB_ALIAS, migrations
@@ -38,7 +38,7 @@ class Command(BaseCommand):
bad_app_labels = set()
for app_label in app_labels:
try:
- cache.get_app(app_label)
+ app_cache.get_app(app_label)
except ImproperlyConfigured:
bad_app_labels.add(app_label)
if bad_app_labels:
@@ -73,7 +73,7 @@ class Command(BaseCommand):
# Detect changes
autodetector = MigrationAutodetector(
loader.graph.project_state(),
- ProjectState.from_app_cache(cache),
+ ProjectState.from_app_cache(app_cache),
InteractiveMigrationQuestioner(specified_apps=app_labels),
)
changes = autodetector.changes(graph=loader.graph, trim_to_apps=app_labels or None)
diff --git a/django/core/management/commands/migrate.py b/django/core/management/commands/migrate.py
index 1966223042..39a2d9a784 100644
--- a/django/core/management/commands/migrate.py
+++ b/django/core/management/commands/migrate.py
@@ -6,13 +6,13 @@ from importlib import import_module
import itertools
import traceback
-from django.apps.cache import cache
+from django.apps import app_cache
from django.conf import settings
from django.core.management import call_command
from django.core.management.base import BaseCommand, CommandError
from django.core.management.color import no_style
from django.core.management.sql import custom_sql_for_model, emit_post_migrate_signal, emit_pre_migrate_signal
-from django.db import connections, router, transaction, models, DEFAULT_DB_ALIAS
+from django.db import connections, router, transaction, DEFAULT_DB_ALIAS
from django.db.migrations.executor import MigrationExecutor
from django.db.migrations.loader import MigrationLoader, AmbiguityError
from django.db.migrations.state import ProjectState
@@ -136,7 +136,7 @@ class Command(BaseCommand):
# If there's changes that aren't in migrations yet, tell them how to fix it.
autodetector = MigrationAutodetector(
executor.loader.graph.project_state(),
- ProjectState.from_app_cache(cache),
+ ProjectState.from_app_cache(app_cache),
)
changes = autodetector.changes(graph=executor.loader.graph)
if changes:
@@ -182,7 +182,7 @@ class Command(BaseCommand):
all_models = [
(app.__name__.split('.')[-2],
router.get_migratable_models(app, connection.alias, include_auto_created=True))
- for app in models.get_apps() if app.__name__.split('.')[-2] in apps
+ for app in app_cache.get_apps() if app.__name__.split('.')[-2] in apps
]
def model_installed(model):
diff --git a/django/core/management/commands/shell.py b/django/core/management/commands/shell.py
index 0d84c9b2ec..12af814161 100644
--- a/django/core/management/commands/shell.py
+++ b/django/core/management/commands/shell.py
@@ -66,8 +66,8 @@ class Command(NoArgsCommand):
def handle_noargs(self, **options):
# XXX: (Temporary) workaround for ticket #1796: force early loading of all
# models from installed apps.
- from django.apps.cache import get_models
- get_models()
+ from django.apps import app_cache
+ app_cache.get_models()
use_plain = options.get('plain', False)
no_startup = options.get('no_startup', False)
diff --git a/django/core/management/commands/sqlsequencereset.py b/django/core/management/commands/sqlsequencereset.py
index 8f4ea823c7..24ec25e8ed 100644
--- a/django/core/management/commands/sqlsequencereset.py
+++ b/django/core/management/commands/sqlsequencereset.py
@@ -2,8 +2,9 @@ from __future__ import unicode_literals
from optparse import make_option
+from django.apps import app_cache
from django.core.management.base import AppCommand
-from django.db import connections, models, DEFAULT_DB_ALIAS
+from django.db import connections, DEFAULT_DB_ALIAS
class Command(AppCommand):
@@ -20,4 +21,4 @@ class Command(AppCommand):
def handle_app(self, app, **options):
connection = connections[options.get('database')]
- return '\n'.join(connection.ops.sequence_reset_sql(self.style, models.get_models(app, include_auto_created=True)))
+ return '\n'.join(connection.ops.sequence_reset_sql(self.style, app_cache.get_models(app, include_auto_created=True)))
diff --git a/django/core/management/sql.py b/django/core/management/sql.py
index 6f60d73ae9..bcd4769dde 100644
--- a/django/core/management/sql.py
+++ b/django/core/management/sql.py
@@ -5,6 +5,7 @@ import os
import re
import warnings
+from django.apps import app_cache
from django.conf import settings
from django.core.management.base import CommandError
from django.db import models, router
@@ -24,7 +25,7 @@ def sql_create(app, style, connection):
# We trim models from the current app so that the sqlreset command does not
# generate invalid SQL (leaving models out of known_models is harmless, so
# we can be conservative).
- app_models = models.get_models(app, include_auto_created=True)
+ app_models = app_cache.get_models(app, include_auto_created=True)
final_output = []
tables = connection.introspection.table_names()
known_models = set(model for model in connection.introspection.installed_models(tables) if model not in app_models)
@@ -168,7 +169,7 @@ def _split_statements(content):
def custom_sql_for_model(model, style, connection):
opts = model._meta
app_dirs = []
- app_dir = models.get_app_path(model._meta.app_label)
+ app_dir = app_cache.get_app_path(model._meta.app_label)
app_dirs.append(os.path.normpath(os.path.join(app_dir, 'sql')))
# Deprecated location -- remove in Django 1.9
@@ -206,7 +207,7 @@ def custom_sql_for_model(model, style, connection):
def emit_pre_migrate_signal(create_models, verbosity, interactive, db):
# Emit the pre_migrate signal for every application.
- for app in models.get_apps():
+ for app in app_cache.get_apps():
app_name = app.__name__.split('.')[-2]
if verbosity >= 2:
print("Running pre-migrate handlers for application %s" % app_name)
@@ -219,7 +220,7 @@ def emit_pre_migrate_signal(create_models, verbosity, interactive, db):
def emit_post_migrate_signal(created_models, verbosity, interactive, db):
# Emit the post_migrate signal for every application.
- for app in models.get_apps():
+ for app in app_cache.get_apps():
app_name = app.__name__.split('.')[-2]
if verbosity >= 2:
print("Running post-migrate handlers for application %s" % app_name)
diff --git a/django/core/management/validation.py b/django/core/management/validation.py
index 459923a088..89aa5ad068 100644
--- a/django/core/management/validation.py
+++ b/django/core/management/validation.py
@@ -26,16 +26,16 @@ def get_validation_errors(outfile, app=None):
validates all models of all installed apps. Writes errors, if any, to outfile.
Returns number of errors.
"""
- from django.apps.cache import get_app_errors
+ from django.apps import app_cache
from django.db import connection, models
from django.db.models.deletion import SET_NULL, SET_DEFAULT
e = ModelErrorCollection(outfile)
- for (app_name, error) in get_app_errors().items():
+ for (app_name, error) in app_cache.get_app_errors().items():
e.add(app_name, error)
- for cls in models.get_models(app, include_swapped=True):
+ for cls in app_cache.get_models(app, include_swapped=True):
opts = cls._meta
# Check swappable attribute.
@@ -45,7 +45,7 @@ def get_validation_errors(outfile, app=None):
except ValueError:
e.add(opts, "%s is not of the form 'app_label.app_name'." % opts.swappable)
continue
- if not models.get_model(app_label, model_name):
+ if not app_cache.get_model(app_label, model_name):
e.add(opts, "Model has been swapped out for '%s' which has not been installed or is abstract." % opts.swapped)
# No need to perform any other validation checks on a swapped model.
continue
@@ -155,7 +155,7 @@ def get_validation_errors(outfile, app=None):
# Check to see if the related field will clash with any existing
# fields, m2m fields, m2m related objects or related objects
if f.rel:
- if f.rel.to not in models.get_models():
+ if f.rel.to not in app_cache.get_models():
# If the related model is swapped, provide a hint;
# otherwise, the model just hasn't been installed.
if not isinstance(f.rel.to, six.string_types) and f.rel.to._meta.swapped:
@@ -210,7 +210,7 @@ def get_validation_errors(outfile, app=None):
# Check to see if the related m2m field will clash with any
# existing fields, m2m fields, m2m related objects or related
# objects
- if f.rel.to not in models.get_models():
+ if f.rel.to not in app_cache.get_models():
# If the related model is swapped, provide a hint;
# otherwise, the model just hasn't been installed.
if not isinstance(f.rel.to, six.string_types) and f.rel.to._meta.swapped:
@@ -268,7 +268,7 @@ def get_validation_errors(outfile, app=None):
)
else:
seen_to = True
- if f.rel.through not in models.get_models(include_auto_created=True):
+ if f.rel.through not in app_cache.get_models(include_auto_created=True):
e.add(opts, "'%s' specifies an m2m relation through model "
"%s, which has not been installed." % (f.name, f.rel.through))
signature = (f.rel.to, cls, f.rel.through)
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index b7d3e28a0d..e575c1d1c2 100644
--- a/django/core/serializers/base.py
+++ b/django/core/serializers/base.py
@@ -3,6 +3,7 @@ Module for abstract serializer/unserializer base classes.
"""
import warnings
+from django.apps import app_cache
from django.db import models
from django.utils import six
@@ -139,7 +140,7 @@ class Deserializer(six.Iterator):
# hack to make sure that the models have all been loaded before
# deserialization starts (otherwise subclass calls to get_model()
# and friends might fail...)
- models.get_apps()
+ app_cache.get_apps()
def __iter__(self):
return self
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py
index 4ac7cc4cf1..07f857a198 100644
--- a/django/core/serializers/python.py
+++ b/django/core/serializers/python.py
@@ -5,6 +5,7 @@ other serializers.
"""
from __future__ import unicode_literals
+from django.apps import app_cache
from django.conf import settings
from django.core.serializers import base
from django.db import models, DEFAULT_DB_ALIAS
@@ -87,7 +88,7 @@ def Deserializer(object_list, **options):
db = options.pop('using', DEFAULT_DB_ALIAS)
ignore = options.pop('ignorenonexistent', False)
- models.get_apps()
+ app_cache.get_apps()
for d in object_list:
# Look up the model and starting build a dict of data for it.
Model = _get_model(d["model"])
@@ -153,7 +154,7 @@ def _get_model(model_identifier):
Helper to look up a model from an "app_label.model_name" string.
"""
try:
- Model = models.get_model(*model_identifier.split("."))
+ Model = app_cache.get_model(*model_identifier.split("."))
except TypeError:
Model = None
if Model is None:
diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py
index 6870ac7d44..e9bea84bb1 100644
--- a/django/core/serializers/xml_serializer.py
+++ b/django/core/serializers/xml_serializer.py
@@ -4,6 +4,7 @@ XML serializer.
from __future__ import unicode_literals
+from django.apps import app_cache
from django.conf import settings
from django.core.serializers import base
from django.db import models, DEFAULT_DB_ALIAS
@@ -276,7 +277,7 @@ class Deserializer(base.Deserializer):
"<%s> node is missing the required '%s' attribute"
% (node.nodeName, attr))
try:
- Model = models.get_model(*model_identifier.split("."))
+ Model = app_cache.get_model(*model_identifier.split("."))
except TypeError:
Model = None
if Model is None:
diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py
index 3faaeffb21..edbca0e557 100644
--- a/django/db/backends/__init__.py
+++ b/django/db/backends/__init__.py
@@ -1268,9 +1268,10 @@ class BaseDatabaseIntrospection(object):
If only_existing is True, the resulting list will only include the tables
that actually exist in the database.
"""
- from django.db import models, router
+ from django.apps import app_cache
+ from django.db import router
tables = set()
- for app in models.get_apps():
+ for app in app_cache.get_apps():
for model in router.get_migratable_models(app, self.connection.alias):
if not model._meta.managed:
continue
@@ -1288,9 +1289,10 @@ class BaseDatabaseIntrospection(object):
def installed_models(self, tables):
"Returns a set of all models represented by the provided list of table names."
- from django.db import models, router
+ from django.apps import app_cache
+ from django.db import router
all_models = []
- for app in models.get_apps():
+ for app in app_cache.get_apps():
all_models.extend(router.get_migratable_models(app, self.connection.alias))
tables = list(map(self.table_name_converter, tables))
return set([
@@ -1300,9 +1302,10 @@ class BaseDatabaseIntrospection(object):
def sequence_list(self):
"Returns a list of information about all DB sequences for all models in all apps."
+ from django.apps import app_cache
from django.db import models, router
- apps = models.get_apps()
+ apps = app_cache.get_apps()
sequence_list = []
for app in apps:
diff --git a/django/db/migrations/loader.py b/django/db/migrations/loader.py
index 101588c4a1..f4a7168441 100644
--- a/django/db/migrations/loader.py
+++ b/django/db/migrations/loader.py
@@ -1,7 +1,8 @@
+from importlib import import_module
import os
import sys
-from importlib import import_module
-from django.apps.cache import cache
+
+from django.apps import app_cache
from django.db.migrations.recorder import MigrationRecorder
from django.db.migrations.graph import MigrationGraph
from django.utils import six
@@ -45,7 +46,7 @@ class MigrationLoader(object):
if app_label in settings.MIGRATION_MODULES:
return settings.MIGRATION_MODULES[app_label]
else:
- return '%s.migrations' % cache.get_app_package(app_label)
+ return '%s.migrations' % app_cache.get_app_package(app_label)
def load_disk(self):
"""
@@ -54,7 +55,7 @@ class MigrationLoader(object):
self.disk_migrations = {}
self.unmigrated_apps = set()
self.migrated_apps = set()
- for app in cache.get_apps():
+ for app in app_cache.get_apps():
# Get the migrations module directory
app_label = app.__name__.split(".")[-2]
module_name = self.migrations_module(app_label)
diff --git a/django/db/migrations/questioner.py b/django/db/migrations/questioner.py
index 7874f23ed0..d9446f8d88 100644
--- a/django/db/migrations/questioner.py
+++ b/django/db/migrations/questioner.py
@@ -2,7 +2,7 @@ import importlib
import os
import sys
-from django.apps.cache import cache
+from django.apps import app_cache
from django.utils import datetime_safe
from django.utils.six.moves import input
from django.core.exceptions import ImproperlyConfigured
@@ -29,7 +29,7 @@ class MigrationQuestioner(object):
# Apps from the new app template will have these; the python
# file check will ensure we skip South ones.
try:
- models_module = cache.get_app(app_label)
+ models_module = app_cache.get_app(app_label)
except ImproperlyConfigured: # It's a fake app
return self.defaults.get("ask_initial", False)
migrations_import_path = "%s.migrations" % models_module.__package__
diff --git a/django/db/migrations/writer.py b/django/db/migrations/writer.py
index 150455b09c..9356c8d8aa 100644
--- a/django/db/migrations/writer.py
+++ b/django/db/migrations/writer.py
@@ -1,9 +1,11 @@
from __future__ import unicode_literals
+
import datetime
-import types
-import os
from importlib import import_module
-from django.apps.cache import cache
+import os
+import types
+
+from django.apps import app_cache
from django.db import models
from django.db.migrations.loader import MigrationLoader
from django.utils.encoding import force_text
@@ -67,9 +69,9 @@ class MigrationWriter(object):
migrations_module = import_module(migrations_package_name)
basedir = os.path.dirname(migrations_module.__file__)
except ImportError:
- app = cache.get_app(self.migration.app_label)
- app_path = cache._get_app_path(app)
- app_package_name = cache._get_app_package(app)
+ app = app_cache.get_app(self.migration.app_label)
+ app_path = app_cache._get_app_path(app)
+ app_package_name = app_cache._get_app_package(app)
migrations_package_basename = migrations_package_name.split(".")[-1]
# Alright, see if it's a direct submodule of the app
diff --git a/django/db/models/__init__.py b/django/db/models/__init__.py
index ad76347494..265550fcce 100644
--- a/django/db/models/__init__.py
+++ b/django/db/models/__init__.py
@@ -1,8 +1,5 @@
from functools import wraps
-from django.apps.cache import ( # NOQA
- get_apps, get_app_path, get_app_paths, get_app, get_models, get_model,
- register_models, UnavailableApp)
from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured # NOQA
from django.db.models.query import Q, QuerySet, Prefetch # NOQA
from django.db.models.expressions import F # NOQA
diff --git a/django/db/models/base.py b/django/db/models/base.py
index f22506aa92..94d7234142 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -5,7 +5,8 @@ import sys
from functools import update_wrapper
from django.utils.six.moves import zip
-from django.apps.cache import get_model, MODELS_MODULE_NAME
+from django.apps import app_cache
+from django.apps.cache import MODELS_MODULE_NAME
import django.db.models.manager # NOQA: Imported to register signal handler.
from django.conf import settings
from django.core.exceptions import (ObjectDoesNotExist,
@@ -1066,7 +1067,7 @@ def model_unpickle(model_id, attrs, factory):
Used to unpickle Model subclasses with deferred fields.
"""
if isinstance(model_id, tuple):
- model = get_model(*model_id)
+ model = app_cache.get_model(*model_id)
else:
# Backwards compat - the model was cached directly in earlier versions.
model = model_id
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index d69a4346e2..830ff2efa2 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -9,7 +9,7 @@ import warnings
from base64 import b64decode, b64encode
from itertools import tee
-from django.apps.cache import get_model
+from django.apps import app_cache
from django.db import connection
from django.db.models.query_utils import QueryWrapper
from django.conf import settings
@@ -51,7 +51,7 @@ BLANK_CHOICE_DASH = [("", "---------")]
def _load_field(app_label, model_name, field_name):
- return get_model(app_label, model_name)._meta.get_field_by_name(field_name)[0]
+ return app_cache.get_model(app_label, model_name)._meta.get_field_by_name(field_name)[0]
class FieldDoesNotExist(Exception):
diff --git a/django/db/models/loading.py b/django/db/models/loading.py
index 795de130b5..1371a15fdf 100644
--- a/django/db/models/loading.py
+++ b/django/db/models/loading.py
@@ -1,6 +1,6 @@
import warnings
-from django.apps.cache import cache
+from django.apps import app_cache
warnings.warn(
"The utilities in django.db.models.loading are deprecated "
@@ -12,14 +12,14 @@ __all__ = ('get_apps', 'get_app', 'get_models', 'get_model', 'register_models',
# These methods were always module level, so are kept that way for backwards
# compatibility.
-get_apps = cache.get_apps
-get_app_package = cache.get_app_package
-get_app_path = cache.get_app_path
-get_app_paths = cache.get_app_paths
-get_app = cache.get_app
-get_app_errors = cache.get_app_errors
-get_models = cache.get_models
-get_model = cache.get_model
-register_models = cache.register_models
-load_app = cache.load_app
-app_cache_ready = cache.app_cache_ready
+get_apps = app_cache.get_apps
+get_app_package = app_cache.get_app_package
+get_app_path = app_cache.get_app_path
+get_app_paths = app_cache.get_app_paths
+get_app = app_cache.get_app
+get_app_errors = app_cache.get_app_errors
+get_models = app_cache.get_models
+get_model = app_cache.get_model
+register_models = app_cache.register_models
+load_app = app_cache.load_app
+app_cache_ready = app_cache.app_cache_ready
diff --git a/django/db/models/options.py b/django/db/models/options.py
index 5d99066343..74090cb921 100644
--- a/django/db/models/options.py
+++ b/django/db/models/options.py
@@ -5,7 +5,7 @@ import re
from bisect import bisect
import warnings
-from django.apps.cache import app_cache_ready, cache
+from django.apps import app_cache
from django.conf import settings
from django.db.models.fields.related import ManyToManyRel
from django.db.models.fields import AutoField, FieldDoesNotExist
@@ -89,7 +89,7 @@ class Options(object):
self.related_fkey_lookups = []
# A custom AppCache to use, if you're making a separate model set.
- self.app_cache = cache
+ self.app_cache = app_cache
def contribute_to_class(self, cls, name):
from django.db import connection
@@ -432,7 +432,7 @@ class Options(object):
if hasattr(f, 'related'):
cache[f.name] = cache[f.attname] = (
f.related, None if f.model == self.model else f.model, True, False)
- if app_cache_ready():
+ if app_cache.app_cache_ready():
self._name_map = cache
return cache
@@ -558,7 +558,7 @@ class Options(object):
and not isinstance(f.rel.to, six.string_types)
and self == f.rel.to._meta):
cache[f.related] = None
- if app_cache_ready():
+ if app_cache.app_cache_ready():
self._related_many_to_many_cache = cache
return cache
diff --git a/django/db/models/signals.py b/django/db/models/signals.py
index 2543cf5f4a..8c835e5f5f 100644
--- a/django/db/models/signals.py
+++ b/django/db/models/signals.py
@@ -1,6 +1,6 @@
from collections import defaultdict
-from django.apps.cache import get_model
+from django.apps import app_cache
from django.dispatch import Signal
from django.utils import six
@@ -41,7 +41,7 @@ class ModelSignal(Signal):
"Specified sender must either be a model or a "
"model name of the 'app_label.ModelName' form."
)
- sender = get_model(app_label, object_name, only_installed=False)
+ sender = app_cache.get_model(app_label, object_name, only_installed=False)
if sender is None:
reference = (app_label, object_name)
self.unresolved_references[reference].append(
diff --git a/django/db/utils.py b/django/db/utils.py
index 43abaf9b5a..702b1b4ebc 100644
--- a/django/db/utils.py
+++ b/django/db/utils.py
@@ -282,6 +282,6 @@ class ConnectionRouter(object):
"""
Return app models allowed to be synchronized on provided db.
"""
- from .models import get_models
- return [model for model in get_models(app, include_auto_created=include_auto_created)
+ from django.apps import app_cache
+ return [model for model in app_cache.get_models(app, include_auto_created=include_auto_created)
if self.allow_migrate(db, model)]
diff --git a/django/test/simple.py b/django/test/simple.py
index 73deef917b..10f29061b3 100644
--- a/django/test/simple.py
+++ b/django/test/simple.py
@@ -9,7 +9,7 @@ import re
import unittest as real_unittest
import warnings
-from django.db.models import get_app, get_apps
+from django.apps import app_cache
from django.test import _doctest as doctest
from django.test import runner
from django.test.utils import compare_xml, strip_quotes
@@ -179,7 +179,7 @@ def build_test(label):
#
# First, look for TestCase instances with a name that matches
#
- app_module = get_app(parts[0])
+ app_module = app_cache.get_app(parts[0])
test_module = get_tests(app_module)
TestClass = getattr(app_module, parts[1], None)
@@ -241,10 +241,10 @@ class DjangoTestSuiteRunner(runner.DiscoverRunner):
if '.' in label:
suite.addTest(build_test(label))
else:
- app = get_app(label)
+ app = app_cache.get_app(label)
suite.addTest(build_suite(app))
else:
- for app in get_apps():
+ for app in app_cache.get_apps():
suite.addTest(build_suite(app))
if extra_tests:
diff --git a/django/test/testcases.py b/django/test/testcases.py
index 52900ec478..1480889565 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -15,7 +15,7 @@ import unittest
from unittest import skipIf # NOQA: Imported here for backward compatibility
from unittest.util import safe_repr
-from django.apps.cache import cache
+from django.apps import app_cache
from django.conf import settings
from django.core import mail
from django.core.exceptions import ValidationError, ImproperlyConfigured
@@ -725,14 +725,14 @@ class TransactionTestCase(SimpleTestCase):
"""
super(TransactionTestCase, self)._pre_setup()
if self.available_apps is not None:
- cache.set_available_apps(self.available_apps)
+ app_cache.set_available_apps(self.available_apps)
for db_name in self._databases_names(include_mirrors=False):
flush.Command.emit_post_migrate(verbosity=0, interactive=False, database=db_name)
try:
self._fixture_setup()
except Exception:
if self.available_apps is not None:
- cache.unset_available_apps()
+ app_cache.unset_available_apps()
raise
def _databases_names(self, include_mirrors=True):
@@ -786,7 +786,7 @@ class TransactionTestCase(SimpleTestCase):
for conn in connections.all():
conn.close()
finally:
- cache.unset_available_apps()
+ app_cache.unset_available_apps()
def _fixture_teardown(self):
# Allow TRUNCATE ... CASCADE and don't emit the post_migrate signal
diff --git a/tests/app_cache/tests.py b/tests/app_cache/tests.py
index 564f9f6f48..cc3637367b 100644
--- a/tests/app_cache/tests.py
+++ b/tests/app_cache/tests.py
@@ -1,6 +1,7 @@
from __future__ import absolute_import
-from django.apps.cache import cache, BaseAppCache
+from django.apps import app_cache
+from django.apps.cache import BaseAppCache
from django.db import models
from django.test import TestCase
@@ -16,8 +17,8 @@ class AppCacheTests(TestCase):
"""
Tests that the models in the models.py file were loaded correctly.
"""
- self.assertEqual(cache.get_model("app_cache", "TotallyNormal"), TotallyNormal)
- self.assertEqual(cache.get_model("app_cache", "SoAlternative"), None)
+ self.assertEqual(app_cache.get_model("app_cache", "TotallyNormal"), TotallyNormal)
+ self.assertEqual(app_cache.get_model("app_cache", "SoAlternative"), None)
self.assertEqual(new_app_cache.get_model("app_cache", "TotallyNormal"), None)
self.assertEqual(new_app_cache.get_model("app_cache", "SoAlternative"), SoAlternative)
@@ -26,7 +27,7 @@ class AppCacheTests(TestCase):
"""
Makes a new model at runtime and ensures it goes into the right place.
"""
- old_models = cache.get_models(cache.get_app("app_cache"))
+ old_models = app_cache.get_models(app_cache.get_app("app_cache"))
# Construct a new model in a new app cache
body = {}
new_app_cache = BaseAppCache()
@@ -41,6 +42,6 @@ class AppCacheTests(TestCase):
# Make sure it appeared in the right place!
self.assertEqual(
old_models,
- cache.get_models(cache.get_app("app_cache")),
+ app_cache.get_models(app_cache.get_app("app_cache")),
)
self.assertEqual(new_app_cache.get_model("app_cache", "SouthPonies"), temp_model)
diff --git a/tests/app_loading/tests.py b/tests/app_loading/tests.py
index a8a5ba120f..b24522fab6 100644
--- a/tests/app_loading/tests.py
+++ b/tests/app_loading/tests.py
@@ -5,7 +5,8 @@ import os
import sys
from unittest import TestCase
-from django.apps.cache import cache, load_app, get_model, get_models, AppCache
+from django.apps import app_cache
+from django.apps.cache import AppCache
from django.test.utils import override_settings
from django.utils._os import upath
@@ -19,48 +20,48 @@ class EggLoadingTest(TestCase):
# This test adds dummy applications to the app cache. These
# need to be removed in order to prevent bad interactions
# with the flush operation in other tests.
- self.old_app_models = copy.deepcopy(cache.app_models)
+ self.old_app_models = copy.deepcopy(app_cache.app_models)
def tearDown(self):
sys.path = self.old_path
- cache.app_models = self.old_app_models
+ app_cache.app_models = self.old_app_models
def test_egg1(self):
"""Models module can be loaded from an app in an egg"""
egg_name = '%s/modelapp.egg' % self.egg_dir
sys.path.append(egg_name)
- models = load_app('app_with_models')
+ models = app_cache.load_app('app_with_models')
self.assertFalse(models is None)
def test_egg2(self):
"""Loading an app from an egg that has no models returns no models (and no error)"""
egg_name = '%s/nomodelapp.egg' % self.egg_dir
sys.path.append(egg_name)
- models = load_app('app_no_models')
+ models = app_cache.load_app('app_no_models')
self.assertTrue(models is None)
def test_egg3(self):
"""Models module can be loaded from an app located under an egg's top-level package"""
egg_name = '%s/omelet.egg' % self.egg_dir
sys.path.append(egg_name)
- models = load_app('omelet.app_with_models')
+ models = app_cache.load_app('omelet.app_with_models')
self.assertFalse(models is None)
def test_egg4(self):
"""Loading an app with no models from under the top-level egg package generates no error"""
egg_name = '%s/omelet.egg' % self.egg_dir
sys.path.append(egg_name)
- models = load_app('omelet.app_no_models')
+ models = app_cache.load_app('omelet.app_no_models')
self.assertTrue(models is None)
def test_egg5(self):
"""Loading an app from an egg that has an import error in its models module raises that error"""
egg_name = '%s/brokenapp.egg' % self.egg_dir
sys.path.append(egg_name)
- self.assertRaises(ImportError, load_app, 'broken_app')
+ self.assertRaises(ImportError, app_cache.load_app, 'broken_app')
raised = None
try:
- load_app('broken_app')
+ app_cache.load_app('broken_app')
except ImportError as e:
raised = e
@@ -81,8 +82,8 @@ class EggLoadingTest(TestCase):
a.loaded = False
try:
with override_settings(INSTALLED_APPS=('notexists',)):
- self.assertRaises(ImportError, get_model, 'notexists', 'nomodel', seed_cache=True)
- self.assertRaises(ImportError, get_model, 'notexists', 'nomodel', seed_cache=True)
+ self.assertRaises(ImportError, app_cache.get_model, 'notexists', 'nomodel', seed_cache=True)
+ self.assertRaises(ImportError, app_cache.get_model, 'notexists', 'nomodel', seed_cache=True)
finally:
a.loaded = True
@@ -94,26 +95,26 @@ class GetModelsTest(TestCase):
def test_get_model_only_returns_installed_models(self):
self.assertEqual(
- get_model("not_installed", "NotInstalledModel"), None)
+ app_cache.get_model("not_installed", "NotInstalledModel"), None)
def test_get_model_with_not_installed(self):
self.assertEqual(
- get_model(
+ app_cache.get_model(
"not_installed", "NotInstalledModel", only_installed=False),
self.not_installed_module.NotInstalledModel)
def test_get_models_only_returns_installed_models(self):
self.assertFalse(
"NotInstalledModel" in
- [m.__name__ for m in get_models()])
+ [m.__name__ for m in app_cache.get_models()])
def test_get_models_with_app_label_only_returns_installed_models(self):
- self.assertEqual(get_models(self.not_installed_module), [])
+ self.assertEqual(app_cache.get_models(self.not_installed_module), [])
def test_get_models_with_not_installed(self):
self.assertTrue(
"NotInstalledModel" in [
- m.__name__ for m in get_models(only_installed=False)])
+ m.__name__ for m in app_cache.get_models(only_installed=False)])
class NotInstalledModelsTest(TestCase):
diff --git a/tests/commands_sql/tests.py b/tests/commands_sql/tests.py
index 3a0b5527f4..82e55d9861 100644
--- a/tests/commands_sql/tests.py
+++ b/tests/commands_sql/tests.py
@@ -1,9 +1,10 @@
from __future__ import unicode_literals
+from django.apps import app_cache
from django.core.management.color import no_style
from django.core.management.sql import (sql_create, sql_delete, sql_indexes,
sql_destroy_indexes, sql_all)
-from django.db import connections, DEFAULT_DB_ALIAS, models, router
+from django.db import connections, DEFAULT_DB_ALIAS, router
from django.test import TestCase
from django.utils import six
@@ -16,7 +17,7 @@ class SQLCommandsTestCase(TestCase):
return len([o for o in output if o.startswith(cmd)])
def test_sql_create(self):
- app = models.get_app('commands_sql')
+ app = app_cache.get_app('commands_sql')
output = sql_create(app, no_style(), connections[DEFAULT_DB_ALIAS])
create_tables = [o for o in output if o.startswith('CREATE TABLE')]
self.assertEqual(len(create_tables), 3)
@@ -25,7 +26,7 @@ class SQLCommandsTestCase(TestCase):
six.assertRegex(self, sql, r'^create table .commands_sql_book.*')
def test_sql_delete(self):
- app = models.get_app('commands_sql')
+ app = app_cache.get_app('commands_sql')
output = sql_delete(app, no_style(), connections[DEFAULT_DB_ALIAS])
drop_tables = [o for o in output if o.startswith('DROP TABLE')]
self.assertEqual(len(drop_tables), 3)
@@ -34,19 +35,19 @@ class SQLCommandsTestCase(TestCase):
six.assertRegex(self, sql, r'^drop table .commands_sql_comment.*')
def test_sql_indexes(self):
- app = models.get_app('commands_sql')
+ app = app_cache.get_app('commands_sql')
output = sql_indexes(app, no_style(), connections[DEFAULT_DB_ALIAS])
# PostgreSQL creates one additional index for CharField
self.assertIn(self.count_ddl(output, 'CREATE INDEX'), [3, 4])
def test_sql_destroy_indexes(self):
- app = models.get_app('commands_sql')
+ app = app_cache.get_app('commands_sql')
output = sql_destroy_indexes(app, no_style(), connections[DEFAULT_DB_ALIAS])
# PostgreSQL creates one additional index for CharField
self.assertIn(self.count_ddl(output, 'DROP INDEX'), [3, 4])
def test_sql_all(self):
- app = models.get_app('commands_sql')
+ app = app_cache.get_app('commands_sql')
output = sql_all(app, no_style(), connections[DEFAULT_DB_ALIAS])
self.assertEqual(self.count_ddl(output, 'CREATE TABLE'), 3)
@@ -68,7 +69,7 @@ class SQLCommandsRouterTestCase(TestCase):
router.routers = self._old_routers
def test_router_honored(self):
- app = models.get_app('commands_sql')
+ app = app_cache.get_app('commands_sql')
for sql_command in (sql_all, sql_create, sql_delete, sql_indexes, sql_destroy_indexes):
output = sql_command(app, no_style(), connections[DEFAULT_DB_ALIAS])
self.assertEqual(len(output), 0,
diff --git a/tests/defer_regress/tests.py b/tests/defer_regress/tests.py
index 0107e8167c..794ea6e18e 100644
--- a/tests/defer_regress/tests.py
+++ b/tests/defer_regress/tests.py
@@ -2,7 +2,7 @@ from __future__ import unicode_literals
from operator import attrgetter
-from django.apps.cache import cache
+from django.apps import app_cache
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.backends.db import SessionStore
from django.db.models import Count
@@ -103,7 +103,7 @@ class DeferRegressionTest(TestCase):
klasses = set(
map(
attrgetter("__name__"),
- cache.get_models(cache.get_app("defer_regress"))
+ app_cache.get_models(app_cache.get_app("defer_regress"))
)
)
self.assertIn("Child", klasses)
@@ -111,13 +111,13 @@ class DeferRegressionTest(TestCase):
self.assertNotIn("Child_Deferred_value", klasses)
self.assertNotIn("Item_Deferred_name", klasses)
self.assertFalse(any(
- k._deferred for k in cache.get_models(cache.get_app("defer_regress"))))
+ k._deferred for k in app_cache.get_models(app_cache.get_app("defer_regress"))))
klasses_with_deferred = set(
map(
attrgetter("__name__"),
- cache.get_models(
- cache.get_app("defer_regress"), include_deferred=True
+ app_cache.get_models(
+ app_cache.get_app("defer_regress"), include_deferred=True
),
)
)
@@ -126,8 +126,8 @@ class DeferRegressionTest(TestCase):
self.assertIn("Child_Deferred_value", klasses_with_deferred)
self.assertIn("Item_Deferred_name", klasses_with_deferred)
self.assertTrue(any(
- k._deferred for k in cache.get_models(
- cache.get_app("defer_regress"), include_deferred=True))
+ k._deferred for k in app_cache.get_models(
+ app_cache.get_app("defer_regress"), include_deferred=True))
)
@override_settings(SESSION_SERIALIZER='django.contrib.sessions.serializers.PickleSerializer')
diff --git a/tests/empty/tests.py b/tests/empty/tests.py
index 2a9f568aea..b8476fc73d 100644
--- a/tests/empty/tests.py
+++ b/tests/empty/tests.py
@@ -1,4 +1,4 @@
-from django.apps.cache import get_app
+from django.apps import app_cache
from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase
from django.test.utils import override_settings
@@ -33,4 +33,4 @@ class NoModelTests(TestCase):
def test_no_models(self):
with six.assertRaisesRegex(self, ImproperlyConfigured,
'App with label no_models is missing a models.py module.'):
- get_app('no_models')
+ app_cache.get_app('no_models')
diff --git a/tests/invalid_models/tests.py b/tests/invalid_models/tests.py
index 46b3dc4c2e..abb7d9b33d 100644
--- a/tests/invalid_models/tests.py
+++ b/tests/invalid_models/tests.py
@@ -2,7 +2,7 @@ import copy
import sys
import unittest
-from django.apps.cache import cache, load_app
+from django.apps import app_cache
from django.core.management.validation import get_validation_errors
from django.test.utils import override_settings
from django.utils.six import StringIO
@@ -22,11 +22,11 @@ class InvalidModelTestCase(unittest.TestCase):
# This test adds dummy applications to the app cache. These
# need to be removed in order to prevent bad interactions
# with the flush operation in other tests.
- self.old_app_models = copy.deepcopy(cache.app_models)
+ self.old_app_models = copy.deepcopy(app_cache.app_models)
def tearDown(self):
- cache.app_models = self.old_app_models
- cache._get_models_cache = {}
+ app_cache.app_models = self.old_app_models
+ app_cache._get_models_cache = {}
sys.stdout = self.old_stdout
# Technically, this isn't an override -- TEST_SWAPPED_MODEL must be
@@ -40,7 +40,7 @@ class InvalidModelTestCase(unittest.TestCase):
)
def test_invalid_models(self):
try:
- module = load_app("invalid_models.invalid_models")
+ module = app_cache.load_app("invalid_models.invalid_models")
except Exception:
self.fail('Unable to load invalid model module')
diff --git a/tests/managers_regress/tests.py b/tests/managers_regress/tests.py
index 25717f7431..de9f72c333 100644
--- a/tests/managers_regress/tests.py
+++ b/tests/managers_regress/tests.py
@@ -1,7 +1,7 @@
from __future__ import unicode_literals
import copy
-from django.apps.cache import cache
+from django.apps import app_cache
from django.db import models
from django.template import Context, Template
from django.test import TestCase
@@ -114,7 +114,7 @@ class ManagersRegressionTests(TestCase):
# This test adds dummy models to the app cache. These
# need to be removed in order to prevent bad interactions
# with the flush operation in other tests.
- old_app_models = copy.deepcopy(cache.app_models)
+ old_app_models = copy.deepcopy(app_cache.app_models)
class SwappableModel(models.Model):
class Meta:
@@ -129,7 +129,7 @@ class ManagersRegressionTests(TestCase):
self.assertEqual(str(e), "Manager isn't available; SwappableModel has been swapped for 'managers_regress.Parent'")
finally:
- cache.app_models = old_app_models
+ app_cache.app_models = old_app_models
@override_settings(TEST_SWAPPABLE_MODEL='managers_regress.Parent')
def test_custom_swappable_manager(self):
@@ -137,7 +137,7 @@ class ManagersRegressionTests(TestCase):
# This test adds dummy models to the app cache. These
# need to be removed in order to prevent bad interactions
# with the flush operation in other tests.
- old_app_models = copy.deepcopy(cache.app_models)
+ old_app_models = copy.deepcopy(app_cache.app_models)
class SwappableModel(models.Model):
@@ -156,7 +156,7 @@ class ManagersRegressionTests(TestCase):
self.assertEqual(str(e), "Manager isn't available; SwappableModel has been swapped for 'managers_regress.Parent'")
finally:
- cache.app_models = old_app_models
+ app_cache.app_models = old_app_models
@override_settings(TEST_SWAPPABLE_MODEL='managers_regress.Parent')
def test_explicit_swappable_manager(self):
@@ -164,7 +164,7 @@ class ManagersRegressionTests(TestCase):
# This test adds dummy models to the app cache. These
# need to be removed in order to prevent bad interactions
# with the flush operation in other tests.
- old_app_models = copy.deepcopy(cache.app_models)
+ old_app_models = copy.deepcopy(app_cache.app_models)
class SwappableModel(models.Model):
@@ -183,7 +183,7 @@ class ManagersRegressionTests(TestCase):
self.assertEqual(str(e), "Manager isn't available; SwappableModel has been swapped for 'managers_regress.Parent'")
finally:
- cache.app_models = old_app_models
+ app_cache.app_models = old_app_models
def test_regress_3871(self):
related = RelatedModel.objects.create()
diff --git a/tests/migrations/test_commands.py b/tests/migrations/test_commands.py
index 9d84d710bb..08b7371301 100644
--- a/tests/migrations/test_commands.py
+++ b/tests/migrations/test_commands.py
@@ -6,7 +6,7 @@ import copy
import os
import shutil
-from django.apps.cache import cache
+from django.apps import app_cache
from django.core.management import call_command, CommandError
from django.test.utils import override_settings
from django.utils import six
@@ -132,11 +132,11 @@ class MakeMigrationsTests(MigrationTestBase):
self.test_dir = os.path.abspath(os.path.dirname(upath(__file__)))
self.migration_dir = os.path.join(self.test_dir, 'migrations_%d' % self.creation_counter)
self.migration_pkg = "migrations.migrations_%d" % self.creation_counter
- self._old_app_models = copy.deepcopy(cache.app_models)
+ self._old_app_models = copy.deepcopy(app_cache.app_models)
def tearDown(self):
- cache.app_models = self._old_app_models
- cache._get_models_cache = {}
+ app_cache.app_models = self._old_app_models
+ app_cache._get_models_cache = {}
os.chdir(self.test_dir)
try:
@@ -152,7 +152,7 @@ class MakeMigrationsTests(MigrationTestBase):
def test_files_content(self):
self.assertTableNotExists("migrations_unicodemodel")
- cache.register_models('migrations', UnicodeModel)
+ app_cache.register_models('migrations', UnicodeModel)
with override_settings(MIGRATION_MODULES={"migrations": self.migration_pkg}):
call_command("makemigrations", "migrations", verbosity=0)
@@ -188,7 +188,7 @@ class MakeMigrationsTests(MigrationTestBase):
def test_failing_migration(self):
#21280 - If a migration fails to serialize, it shouldn't generate an empty file.
- cache.register_models('migrations', UnserializableModel)
+ app_cache.register_models('migrations', UnserializableModel)
with six.assertRaisesRegex(self, ValueError, r'Cannot serialize'):
with override_settings(MIGRATION_MODULES={"migrations": self.migration_pkg}):
diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py
index 20aff59de2..d844d36c39 100644
--- a/tests/migrations/test_operations.py
+++ b/tests/migrations/test_operations.py
@@ -1,4 +1,5 @@
import unittest
+from django.apps import app_cache
from django.db import connection, models, migrations, router
from django.db.models.fields import NOT_PROVIDED
from django.db.transaction import atomic
@@ -203,8 +204,8 @@ class OperationTests(MigrationTestBase):
self.assertColumnNotExists("test_adflmm_pony", "stables")
# Make sure the M2M field actually works
with atomic():
- app_cache = new_state.render()
- Pony = app_cache.get_model("test_adflmm", "Pony")
+ new_app_cache = new_state.render()
+ Pony = new_app_cache.get_model("test_adflmm", "Pony")
p = Pony.objects.create(pink=False, weight=4.55)
p.stables.create()
self.assertEqual(p.stables.count(), 1)
diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py
index cc32a7d751..960af90eaa 100644
--- a/tests/migrations/test_writer.py
+++ b/tests/migrations/test_writer.py
@@ -5,7 +5,7 @@ from __future__ import unicode_literals
import datetime
import os
-from django.apps.cache import cache
+from django.apps import app_cache
from django.core.validators import RegexValidator, EmailValidator
from django.db import models, migrations
from django.db.migrations.writer import MigrationWriter
@@ -124,7 +124,7 @@ class WriterTests(TestCase):
with override_settings(INSTALLED_APPS=test_apps):
for app in test_apps:
- cache.load_app(app)
+ app_cache.load_app(app)
migration = migrations.Migration('0001_initial', app.split('.')[-1])
expected_path = os.path.join(base_dir, *(app.split('.') + ['migrations', '0001_initial.py']))
writer = MigrationWriter(migration)
diff --git a/tests/proxy_model_inheritance/tests.py b/tests/proxy_model_inheritance/tests.py
index 0fad8c594f..23058d122b 100644
--- a/tests/proxy_model_inheritance/tests.py
+++ b/tests/proxy_model_inheritance/tests.py
@@ -3,7 +3,7 @@ from __future__ import unicode_literals
import os
import sys
-from django.apps.cache import cache, load_app
+from django.apps import app_cache
from django.conf import settings
from django.core.management import call_command
from django.test import TestCase, TransactionTestCase
@@ -28,21 +28,21 @@ class ProxyModelInheritanceTests(TransactionTestCase):
self.old_sys_path = sys.path[:]
sys.path.append(os.path.dirname(os.path.abspath(upath(__file__))))
for app in settings.INSTALLED_APPS:
- load_app(app)
+ app_cache.load_app(app)
def tearDown(self):
sys.path = self.old_sys_path
- del cache.app_labels['app1']
- del cache.app_labels['app2']
- del cache.app_models['app1']
- del cache.app_models['app2']
+ del app_cache.app_labels['app1']
+ del app_cache.app_labels['app2']
+ del app_cache.app_models['app1']
+ del app_cache.app_models['app2']
def test_table_exists(self):
try:
- cache.set_available_apps(settings.INSTALLED_APPS)
+ app_cache.set_available_apps(settings.INSTALLED_APPS)
call_command('migrate', verbosity=0)
finally:
- cache.unset_available_apps()
+ app_cache.unset_available_apps()
from .app1.models import ProxyModel
from .app2.models import NiceModel
self.assertEqual(NiceModel.objects.all().count(), 0)
diff --git a/tests/proxy_models/tests.py b/tests/proxy_models/tests.py
index 5b9433bbf7..cdd979a399 100644
--- a/tests/proxy_models/tests.py
+++ b/tests/proxy_models/tests.py
@@ -1,7 +1,7 @@
from __future__ import unicode_literals
import copy
-from django.apps.cache import cache
+from django.apps import app_cache
from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from django.core import management
@@ -159,7 +159,7 @@ class ProxyModelTests(TestCase):
# This test adds dummy applications to the app cache. These
# need to be removed in order to prevent bad interactions
# with the flush operation in other tests.
- old_app_models = copy.deepcopy(cache.app_models)
+ old_app_models = copy.deepcopy(app_cache.app_models)
class SwappableModel(models.Model):
@@ -176,7 +176,7 @@ class ProxyModelTests(TestCase):
class Meta:
proxy = True
finally:
- cache.app_models = old_app_models
+ app_cache.app_models = old_app_models
def test_myperson_manager(self):
Person.objects.create(name="fred")
diff --git a/tests/runtests.py b/tests/runtests.py
index 8bcb06e522..9ef81f8877 100755
--- a/tests/runtests.py
+++ b/tests/runtests.py
@@ -80,13 +80,13 @@ def get_test_modules():
def get_installed():
- from django.apps.cache import get_apps
- return [app.__name__.rsplit('.', 1)[0] for app in get_apps()]
+ from django.apps import app_cache
+ return [app.__name__.rsplit('.', 1)[0] for app in app_cache.get_apps()]
def setup(verbosity, test_labels):
import django
- from django.apps.cache import get_apps, load_app
+ from django.apps import app_cache
from django.conf import settings
from django.test import TransactionTestCase, TestCase
@@ -128,7 +128,7 @@ def setup(verbosity, test_labels):
# Load all the ALWAYS_INSTALLED_APPS.
with warnings.catch_warnings():
warnings.filterwarnings('ignore', 'django.contrib.comments is deprecated and will be removed before Django 1.8.', DeprecationWarning)
- get_apps()
+ app_cache.get_apps()
# Load all the test model apps.
test_modules = get_test_modules()
@@ -164,7 +164,7 @@ def setup(verbosity, test_labels):
if module_found_in_labels:
if verbosity >= 2:
print("Importing application %s" % module_name)
- mod = load_app(module_label)
+ mod = app_cache.load_app(module_label)
if mod:
if module_label not in settings.INSTALLED_APPS:
settings.INSTALLED_APPS.append(module_label)
diff --git a/tests/swappable_models/tests.py b/tests/swappable_models/tests.py
index ae42366745..0beb95af3e 100644
--- a/tests/swappable_models/tests.py
+++ b/tests/swappable_models/tests.py
@@ -2,7 +2,7 @@ from __future__ import unicode_literals
from django.utils.six import StringIO
-from django.apps.cache import cache
+from django.apps import app_cache
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.core import management
@@ -23,12 +23,12 @@ class SwappableModelTests(TestCase):
def setUp(self):
# This test modifies the installed apps, so we need to make sure
# we're not dealing with a cached app list.
- cache._get_models_cache.clear()
+ app_cache._get_models_cache.clear()
def tearDown(self):
# By fiddling with swappable models, we alter the installed models
# cache, so flush it to make sure there are no side effects.
- cache._get_models_cache.clear()
+ app_cache._get_models_cache.clear()
@override_settings(TEST_ARTICLE_MODEL='swappable_models.AlternateArticle')
def test_generated_data(self):
diff --git a/tests/tablespaces/tests.py b/tests/tablespaces/tests.py
index 04240bcaa1..9bcfed05ed 100644
--- a/tests/tablespaces/tests.py
+++ b/tests/tablespaces/tests.py
@@ -2,7 +2,7 @@ from __future__ import unicode_literals
import copy
-from django.apps.cache import cache
+from django.apps import app_cache
from django.conf import settings
from django.db import connection
from django.core.management.color import no_style
@@ -28,7 +28,7 @@ class TablespacesTests(TestCase):
def setUp(self):
# The unmanaged models need to be removed after the test in order to
# prevent bad interactions with the flush operation in other tests.
- self.old_app_models = copy.deepcopy(cache.app_models)
+ self.old_app_models = copy.deepcopy(app_cache.app_models)
for model in Article, Authors, Reviewers, Scientist:
model._meta.managed = True
@@ -37,8 +37,8 @@ class TablespacesTests(TestCase):
for model in Article, Authors, Reviewers, Scientist:
model._meta.managed = False
- cache.app_models = self.old_app_models
- cache._get_models_cache = {}
+ app_cache.app_models = self.old_app_models
+ app_cache._get_models_cache = {}
def assertNumContains(self, haystack, needle, count):
real_count = haystack.count(needle)
diff --git a/tests/test_suite_override/tests.py b/tests/test_suite_override/tests.py
index e69dab12bf..ed336076e7 100644
--- a/tests/test_suite_override/tests.py
+++ b/tests/test_suite_override/tests.py
@@ -1,6 +1,6 @@
import unittest
-from django.db.models import get_app
+from django.apps import app_cache
from django.test.utils import IgnoreAllDeprecationWarningsMixin
@@ -20,7 +20,7 @@ class SuiteOverrideTest(IgnoreAllDeprecationWarningsMixin, unittest.TestCase):
"""
from django.test.simple import build_suite
- app = get_app("test_suite_override")
+ app = app_cache.get_app("test_suite_override")
suite = build_suite(app)
self.assertEqual(suite.countTestCases(), 1)