summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorLuke Plant <L.Plant.98@cantab.net>2012-03-01 00:57:01 +0000
committerLuke Plant <L.Plant.98@cantab.net>2012-03-01 00:57:01 +0000
commit3db5b0e48554ccc76becefb86b630c9cf72be9f1 (patch)
tree5cad633f6ecaafebd2f7ecea2cdbd0f820134f24 /django
parent413e37481d0b81d50b5826f660eeb79f360be9fc (diff)
Fixed #17696 - Queryset prefetch_related() ignores using()
Thanks to simon29 for the report. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17605 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/contrib/contenttypes/generic.py2
-rw-r--r--django/db/models/fields/related.py9
2 files changed, 6 insertions, 5 deletions
diff --git a/django/contrib/contenttypes/generic.py b/django/contrib/contenttypes/generic.py
index c5137877cb..5ed81a3664 100644
--- a/django/contrib/contenttypes/generic.py
+++ b/django/contrib/contenttypes/generic.py
@@ -321,7 +321,7 @@ def create_generic_related_manager(superclass):
return super(GenericRelatedObjectManager, self).get_query_set().using(db).filter(**self.core_filters)
def get_prefetch_query_set(self, instances):
- db = self._db or router.db_for_read(self.model)
+ db = self._db or router.db_for_read(self.model, instance=instances[0])
query = {
'%s__pk' % self.content_type_field_name: self.content_type.id,
'%s__in' % self.object_id_field_name:
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 53f9b9f8c2..e23c7dc9b0 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -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(),
+ return (self.get_query_set(instance=instances[0]),
attrgetter(self.related.field.attname),
lambda obj: obj._get_pk_val(),
True,
@@ -322,7 +322,7 @@ class ReverseSingleRelatedObjectDescriptor(object):
params = {'%s__pk__in' % self.field.rel.field_name: vals}
else:
params = {'%s__in' % self.field.rel.field_name: vals}
- return (self.get_query_set().filter(**params),
+ return (self.get_query_set(instance=instances[0]).filter(**params),
attrgetter(self.field.rel.field_name),
attrgetter(self.field.attname),
True,
@@ -461,7 +461,7 @@ class ForeignRelatedObjectsDescriptor(object):
return super(RelatedManager, self).get_query_set().using(db).filter(**self.core_filters)
def get_prefetch_query_set(self, instances):
- db = self._db or router.db_for_read(self.model)
+ db = self._db or router.db_for_read(self.model, instance=instances[0])
query = {'%s__%s__in' % (rel_field.name, attname):
set(getattr(obj, attname) for obj in instances)}
qs = super(RelatedManager, self).get_query_set().using(db).filter(**query)
@@ -543,8 +543,9 @@ def create_many_related_manager(superclass, rel):
return super(ManyRelatedManager, self).get_query_set().using(db)._next_is_sticky().filter(**self.core_filters)
def get_prefetch_query_set(self, instances):
+ instance = instances[0]
from django.db import connections
- db = self._db or router.db_for_read(self.model)
+ db = self._db or router.db_for_read(instance.__class__, instance=instance)
query = {'%s__pk__in' % self.query_field_name:
set(obj._get_pk_val() for obj in instances)}
qs = super(ManyRelatedManager, self).get_query_set().using(db)._next_is_sticky().filter(**query)