A bug from queryset-refactor days: although the Query class has "group_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
This commit is contained in:
parent
11fd9f2d84
commit
e47cc781d8
|
@ -292,6 +292,11 @@ class Query(object):
|
||||||
grouping = self.get_grouping()
|
grouping = self.get_grouping()
|
||||||
result.append('GROUP BY %s' % ', '.join(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:
|
if ordering:
|
||||||
result.append('ORDER BY %s' % ', '.join(ordering))
|
result.append('ORDER BY %s' % ', '.join(ordering))
|
||||||
|
|
||||||
|
@ -573,6 +578,24 @@ class Query(object):
|
||||||
result.append(str(col))
|
result.append(str(col))
|
||||||
return result
|
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):
|
def get_ordering(self):
|
||||||
"""
|
"""
|
||||||
Returns list representing the SQL elements in the "order by" clause.
|
Returns list representing the SQL elements in the "order by" clause.
|
||||||
|
|
|
@ -953,6 +953,19 @@ relations.
|
||||||
>>> len([x[2] for x in q.alias_map.values() if x[2] == q.LOUTER and q.alias_refcount[x[1]]])
|
>>> len([x[2] for x in q.alias_map.values() if x[2] == q.LOUTER and q.alias_refcount[x[1]]])
|
||||||
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__
|
# In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__
|
||||||
|
|
Loading…
Reference in New Issue