From 522b0bc91f6eddfcc8b8cc0f3d3566983f5bdfc2 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Mon, 19 Oct 2015 14:17:55 -0400 Subject: [1.9.x] Fixed #25563 -- Cached deferred models in their proxied model's _meta.apps. Thanks to Andriy Sokolovskiy for the report and Tim Graham for the review. Backport of 3db3ab71e97d34260057a6f51d4b2f72da30dc8d from master --- tests/defer_regress/tests.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'tests') diff --git a/tests/defer_regress/tests.py b/tests/defer_regress/tests.py index d8c6e01884..cc1658ce58 100644 --- a/tests/defer_regress/tests.py +++ b/tests/defer_regress/tests.py @@ -3,8 +3,10 @@ from __future__ import unicode_literals from operator import attrgetter from django.apps import apps +from django.apps.registry import Apps from django.contrib.contenttypes.models import ContentType from django.contrib.sessions.backends.db import SessionStore +from django.db import models from django.db.models import Count from django.db.models.query_utils import ( DeferredAttribute, deferred_class_factory, @@ -263,6 +265,24 @@ class DeferRegressionTest(TestCase): deferred_cls = deferred_class_factory(Item, ()) self.assertFalse(deferred_cls._deferred) + def test_deferred_class_factory_apps_reuse(self): + """ + #25563 - model._meta.apps should be used for caching and + retrieval of the created proxy class. + """ + isolated_apps = Apps(['defer_regress']) + + class BaseModel(models.Model): + field = models.BooleanField() + + class Meta: + apps = isolated_apps + app_label = 'defer_regress' + + deferred_model = deferred_class_factory(BaseModel, ['field']) + self.assertIs(deferred_model._meta.apps, isolated_apps) + self.assertIs(deferred_class_factory(BaseModel, ['field']), deferred_model) + class DeferAnnotateSelectRelatedTest(TestCase): def test_defer_annotate_select_related(self): -- cgit v1.3