Commit 1f11069a authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Fixed #18090 -- Applied filters when running prefetch_related backwards...

Fixed #18090 -- Applied filters when running prefetch_related backwards through a one-to-one relation.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@17888 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent f195f1ed
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -239,7 +239,7 @@ class SingleRelatedObjectDescriptor(object):
    def get_prefetch_query_set(self, instances):
        vals = set(instance._get_pk_val() for instance in instances)
        params = {'%s__pk__in' % self.related.field.name: vals}
        return (self.get_query_set(instance=instances[0]),
        return (self.get_query_set(instance=instances[0]).filter(**params),
                attrgetter(self.related.field.attname),
                lambda obj: obj._get_pk_val(),
                True,
+7 −0
Original line number Diff line number Diff line
from __future__ import absolute_import

from django.contrib.contenttypes.models import ContentType
from django.db import connection
from django.test import TestCase
from django.test.utils import override_settings

from .models import (Author, Book, Reader, Qualification, Teacher, Department,
    TaggedItem, Bookmark, AuthorAddress, FavoriteAuthors, AuthorWithAge,
@@ -356,10 +358,15 @@ class MultiTableInheritanceTest(TestCase):
        with self.assertNumQueries(2):
            [a.author for a in AuthorWithAge.objects.prefetch_related('author')]

    @override_settings(DEBUG=True)
    def test_child_link_prefetch(self):
        with self.assertNumQueries(2):
            l = [a.authorwithage for a in Author.objects.prefetch_related('authorwithage')]

        # Regression for #18090: the prefetching query must include an IN clause.
        self.assertIn('authorwithage', connection.queries[-1]['sql'])
        self.assertIn(' IN ', connection.queries[-1]['sql'])

        self.assertEqual(l, [a.authorwithage for a in Author.objects.all()])