1
0
mirror of https://github.com/django/django.git synced 2025-07-05 18:29:11 +00:00

queryset-refactor: Removed an unwanted side-effect from the Query.as_sql() method.

Fixed #7056


git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@7445 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2008-04-23 09:26:14 +00:00
parent 382d31a981
commit 42260ef737

View File

@ -7,7 +7,6 @@ databases). The abstraction barrier only works one way: this module has to know
all about the internals of models in order to get the information it needs. all about the internals of models in order to get the information it needs.
""" """
import itertools
from copy import deepcopy from copy import deepcopy
from django.utils.tree import Node from django.utils.tree import Node
@ -66,6 +65,7 @@ class Query(object):
self.low_mark, self.high_mark = 0, None # Used for offset/limit self.low_mark, self.high_mark = 0, None # Used for offset/limit
self.distinct = False self.distinct = False
self.select_related = False self.select_related = False
self.related_select_cols = []
# Arbitrary maximum limit for select_related. Prevents infinite # Arbitrary maximum limit for select_related. Prevents infinite
# recursion. Can be changed by the depth parameter to select_related(). # recursion. Can be changed by the depth parameter to select_related().
@ -150,6 +150,7 @@ class Query(object):
obj.low_mark, obj.high_mark = self.low_mark, self.high_mark obj.low_mark, obj.high_mark = self.low_mark, self.high_mark
obj.distinct = self.distinct obj.distinct = self.distinct
obj.select_related = self.select_related obj.select_related = self.select_related
obj.related_select_cols = []
obj.max_depth = self.max_depth obj.max_depth = self.max_depth
obj.extra_select = self.extra_select.copy() obj.extra_select = self.extra_select.copy()
obj.extra_select_params = self.extra_select_params obj.extra_select_params = self.extra_select_params
@ -183,6 +184,7 @@ class Query(object):
obj.clear_ordering(True) obj.clear_ordering(True)
obj.clear_limits() obj.clear_limits()
obj.select_related = False obj.select_related = False
obj.related_select_cols = []
if obj.distinct and len(obj.select) > 1: if obj.distinct and len(obj.select) > 1:
obj = self.clone(CountQuery, _query=obj, where=self.where_class(), obj = self.clone(CountQuery, _query=obj, where=self.where_class(),
distinct=False) distinct=False)
@ -345,7 +347,7 @@ class Query(object):
""" """
if not self.tables: if not self.tables:
self.join((None, self.model._meta.db_table, None, None)) self.join((None, self.model._meta.db_table, None, None))
if self.select_related: if self.select_related and not self.related_select_cols:
self.fill_related_selections() self.fill_related_selections()
def get_columns(self): def get_columns(self):
@ -371,6 +373,10 @@ class Query(object):
cols = self.get_default_columns(True) cols = self.get_default_columns(True)
result.extend(cols) result.extend(cols)
aliases.extend(cols) aliases.extend(cols)
for table, col in self.related_select_cols:
r = '%s.%s' % (qn(table), qn(col))
result.append(r)
aliases.append(r)
self._select_aliases = set(aliases) self._select_aliases = set(aliases)
return result return result
@ -769,7 +775,7 @@ class Query(object):
if not opts: if not opts:
opts = self.get_meta() opts = self.get_meta()
root_alias = self.get_initial_alias() root_alias = self.get_initial_alias()
self.select.extend(self.get_default_columns()) self.related_select_cols = []
if not used: if not used:
used = set() used = set()
@ -802,7 +808,7 @@ class Query(object):
f.rel.get_related_field().column), exclusions=used, f.rel.get_related_field().column), exclusions=used,
promote=f.null) promote=f.null)
used.add(alias) used.add(alias)
self.select.extend([(alias, f2.column) self.related_select_cols.extend([(alias, f2.column)
for f2 in f.rel.to._meta.fields]) for f2 in f.rel.to._meta.fields])
if restricted: if restricted:
next = requested.get(f.name, {}) next = requested.get(f.name, {})
@ -1278,6 +1284,7 @@ class Query(object):
for part in field.split(LOOKUP_SEP): for part in field.split(LOOKUP_SEP):
d = d.setdefault(part, {}) d = d.setdefault(part, {})
self.select_related = field_dict self.select_related = field_dict
self.related_select_cols = []
def add_extra(self, select, select_params, where, params, tables, order_by): def add_extra(self, select, select_params, where, params, tables, order_by):
""" """