summaryrefslogtreecommitdiff
path: root/django/db
diff options
context:
space:
mode:
authorLuke Plant <L.Plant.98@cantab.net>2011-10-08 13:50:29 +0000
committerLuke Plant <L.Plant.98@cantab.net>2011-10-08 13:50:29 +0000
commitd5803bb5fb1a301a014bb681fedc09e2bcc6967b (patch)
tree3e44f111ec18c50e1ff19f922e3bda710f6923e5 /django/db
parent095dbe8804d89785b59ef0cd0381a31b31a2dab5 (diff)
More efficient IN clauses for prefetch_related queries by use of sets to eliminate duplicates
This simply reduces the size of the IN clause in the SQL, which can be significant in some cases. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16944 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db')
-rw-r--r--django/db/models/fields/related.py8
1 files changed, 4 insertions, 4 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index c82c397288..8c054e7303 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -237,7 +237,7 @@ class SingleRelatedObjectDescriptor(object):
return self.related.model._base_manager.using(db)
def get_prefetch_query_set(self, instances):
- vals = [instance._get_pk_val() for instance in 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(),
attrgetter(self.related.field.attname),
@@ -316,7 +316,7 @@ class ReverseSingleRelatedObjectDescriptor(object):
return QuerySet(self.field.rel.to).using(db)
def get_prefetch_query_set(self, instances):
- vals = [getattr(instance, self.field.attname) for instance in instances]
+ vals = set(getattr(instance, self.field.attname) for instance in instances)
other_field = self.field.rel.get_related_field()
if other_field.rel:
params = {'%s__pk__in' % self.field.rel.field_name: vals}
@@ -463,7 +463,7 @@ class ForeignRelatedObjectsDescriptor(object):
def get_prefetch_query_set(self, instances):
db = self._db or router.db_for_read(self.model)
query = {'%s__%s__in' % (rel_field.name, attname):
- [getattr(obj, attname) for obj in instances]}
+ set(getattr(obj, attname) for obj in instances)}
qs = super(RelatedManager, self).get_query_set().using(db).filter(**query)
return (qs,
attrgetter(rel_field.get_attname()),
@@ -546,7 +546,7 @@ def create_many_related_manager(superclass, rel):
from django.db import connections
db = self._db or router.db_for_read(self.model)
query = {'%s__pk__in' % self.query_field_name:
- [obj._get_pk_val() for obj in instances]}
+ set(obj._get_pk_val() for obj in instances)}
qs = super(ManyRelatedManager, self).get_query_set().using(db)._next_is_sticky().filter(**query)
# M2M: need to annotate the query in order to get the primary model