Skip to content

Instantly share code, notes, and snippets.

@collinanderson
Created March 15, 2010 21:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save collinanderson/333355 to your computer and use it in GitHub Desktop.
Save collinanderson/333355 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
from django.db.models.aggregates import Aggregate
from django.db.models.sql.aggregates import Aggregate as SqlAggregate
from django.db.models.sql.query import Query
class SqlGetter(SqlAggregate):
sql_function = ''
class SqlQuery(Query):
def resolve_aggregate(self, value, aggregate, **kwargs):
# resolve_aggregate expects value to be a number.
if isinstance(aggregate, SqlGetter):
return value
return super(SqlQuery, self).resolve_aggregate(value, aggregate, **kwargs)
class Getter(Aggregate):
@property
def default_alias(self):
return self.lookup
def add_to_query(self, query, alias, col, source, is_summary):
query.aggregates[alias] = SqlGetter(col, source=source, is_summary=is_summary, **self.extra)
query.__class__ = SqlQuery # Monkey Patch
#How to use it:
from django.db import models
class Related(models.Model):
some_field = models.CharField()
field_i_dont_want_to_load = models.TextField()
field_i_dont_want_to_load2 = models.TextField()
field_i_dont_want_to_load3 = models.TextField()
class Example(models.Model):
related = models.ForeignKey(Related)
Example.objects.all().annotate(Getter('related__some_field'))'
# This is similar to:
Example.objects.all().select_related().defer('related__field_i_dont_want_to_load', 'related__field_i_dont_want_to_load2', 'related__field_i_dont_want_to_load3')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment