Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

A bug from queryset-refactor days: although the Query class has "grou…

…p_by" and

"having" attributes, only the former was included in the resulting SQL, meaning
subclasses had to completely duplicate Query.as_sql() if they were using any
kind of grouping filtering on the results.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@9007 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit e47cc781d844eea72e677d1d212b2dfd1b0c9225 1 parent 11fd9f2
@malcolmt malcolmt authored
View
23 django/db/models/sql/query.py
@@ -292,6 +292,11 @@ def as_sql(self, with_limits=True, with_col_aliases=False):
grouping = self.get_grouping()
result.append('GROUP BY %s' % ', '.join(grouping))
+ if self.having:
+ having, h_params = self.get_having()
+ result.append('HAVING %s' % ', '.join(having))
+ params.extend(h_params)
+
if ordering:
result.append('ORDER BY %s' % ', '.join(ordering))
@@ -573,6 +578,24 @@ def get_grouping(self):
result.append(str(col))
return result
+ def get_having(self):
+ """
+ Returns a tuple representing the SQL elements in the "having" clause.
+ By default, the elements of self.having have their as_sql() method
+ called or are returned unchanged (if they don't have an as_sql()
+ method).
+ """
+ result = []
+ params = []
+ for elt in self.having:
+ if hasattr(elt, 'as_sql'):
+ sql, params = elt.as_sql()
+ result.append(sql)
+ params.extend(params)
+ else:
+ result.append(elt)
+ return result, params
+
def get_ordering(self):
"""
Returns list representing the SQL elements in the "order by" clause.
View
13 tests/regressiontests/queries/models.py
@@ -953,6 +953,19 @@ def __unicode__(self):
>>> len([x[2] for x in q.alias_map.values() if x[2] == q.LOUTER and q.alias_refcount[x[1]]])
1
+A check to ensure we don't break the internal query construction of GROUP BY
+and HAVING. These aren't supported in the public API, but the Query class knows
+about them and shouldn't do bad things.
+>>> qs = Tag.objects.values_list('parent_id', flat=True).order_by()
+>>> qs.query.group_by = ['parent_id']
+>>> qs.query.having = ['count(parent_id) > 1']
+>>> expected = [t3.parent_id, t4.parent_id]
+>>> expected.sort()
+>>> result = list(qs)
+>>> result.sort()
+>>> expected == result
+True
+
"""}
# In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__
Please sign in to comment.
Something went wrong with that request. Please try again.