mirror of
https://github.com/django/django.git
synced 2025-10-25 22:56:12 +00:00
Fixed #3566 -- Added support for aggregation to the ORM. See the documentation for details on usage.
Many thanks to: * Nicolas Lara, who worked on this feature during the 2008 Google Summer of Code. * Alex Gaynor for his help debugging and fixing a number of issues. * Justin Bronn for his help integrating with contrib.gis. * Karen Tracey for her help with cross-platform testing. * Ian Kelly for his help testing and fixing Oracle support. * Malcolm Tredinnick for his invaluable review notes. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9742 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
@@ -25,59 +25,6 @@ class RawValue(object):
|
||||
def __init__(self, value):
|
||||
self.value = value
|
||||
|
||||
class Aggregate(object):
|
||||
"""
|
||||
Base class for all aggregate-related classes (min, max, avg, count, sum).
|
||||
"""
|
||||
def relabel_aliases(self, change_map):
|
||||
"""
|
||||
Relabel the column alias, if necessary. Must be implemented by
|
||||
subclasses.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def as_sql(self, quote_func=None):
|
||||
"""
|
||||
Returns the SQL string fragment for this object.
|
||||
|
||||
The quote_func function is used to quote the column components. If
|
||||
None, it defaults to doing nothing.
|
||||
|
||||
Must be implemented by subclasses.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
class Count(Aggregate):
|
||||
"""
|
||||
Perform a count on the given column.
|
||||
"""
|
||||
def __init__(self, col='*', distinct=False):
|
||||
"""
|
||||
Set the column to count on (defaults to '*') and set whether the count
|
||||
should be distinct or not.
|
||||
"""
|
||||
self.col = col
|
||||
self.distinct = distinct
|
||||
|
||||
def relabel_aliases(self, change_map):
|
||||
c = self.col
|
||||
if isinstance(c, (list, tuple)):
|
||||
self.col = (change_map.get(c[0], c[0]), c[1])
|
||||
|
||||
def as_sql(self, quote_func=None):
|
||||
if not quote_func:
|
||||
quote_func = lambda x: x
|
||||
if isinstance(self.col, (list, tuple)):
|
||||
col = ('%s.%s' % tuple([quote_func(c) for c in self.col]))
|
||||
elif hasattr(self.col, 'as_sql'):
|
||||
col = self.col.as_sql(quote_func)
|
||||
else:
|
||||
col = self.col
|
||||
if self.distinct:
|
||||
return 'COUNT(DISTINCT %s)' % col
|
||||
else:
|
||||
return 'COUNT(%s)' % col
|
||||
|
||||
class Date(object):
|
||||
"""
|
||||
Add a date selection column.
|
||||
|
||||
Reference in New Issue
Block a user