From dcf0a35b088ba9ce8907d8f34178bd6dffc27022 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Tue, 19 Jul 2016 14:55:59 -0400 Subject: [1.10.x] Fixed #26916 -- Fixed prefetch_related when using a cached_property as to_attr. Thanks Trac alias karyon for the report and Tim for the review. Backport of 271bfe65d986f5ecbaeb7a70a3092356c0a9e222 from master --- tests/prefetch_related/models.py | 5 +++++ tests/prefetch_related/tests.py | 11 +++++++++++ 2 files changed, 16 insertions(+) (limited to 'tests') diff --git a/tests/prefetch_related/models.py b/tests/prefetch_related/models.py index 32570e9109..064ce1dfbd 100644 --- a/tests/prefetch_related/models.py +++ b/tests/prefetch_related/models.py @@ -6,6 +6,7 @@ from django.contrib.contenttypes.fields import ( from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils.encoding import python_2_unicode_compatible +from django.utils.functional import cached_property # Basic tests @@ -219,6 +220,10 @@ class Person(models.Model): def all_houses(self): return list(self.houses.all()) + @cached_property + def cached_all_houses(self): + return self.all_houses + class Meta: ordering = ['id'] diff --git a/tests/prefetch_related/tests.py b/tests/prefetch_related/tests.py index c34682a33d..7c36975084 100644 --- a/tests/prefetch_related/tests.py +++ b/tests/prefetch_related/tests.py @@ -743,6 +743,17 @@ class CustomPrefetchTests(TestCase): ).get(pk=self.house3.pk) self.assertIsInstance(house.rooms.all(), QuerySet) + def test_to_attr_cached_property(self): + persons = Person.objects.prefetch_related( + Prefetch('houses', House.objects.all(), to_attr='cached_all_houses'), + ) + for person in persons: + # To bypass caching at the related descriptor level, don't use + # person.houses.all() here. + all_houses = list(House.objects.filter(occupants=person)) + with self.assertNumQueries(0): + self.assertEqual(person.cached_all_houses, all_houses) + class DefaultManagerTests(TestCase): -- cgit v1.3