This returns usable results:
Season.objects.values('name','match__matchresult__player__username').annotate(points=Sum('match__matchresult__points')).distinct()
I also needed to implement SumWithDefault to get rid of NULLs:
from django.db.models.sql.aggregates import Aggregate
from django.db.models import Aggregate as Ag
class SumWithDefaultSQL(Aggregate):
def __init__(self, col, default=None, **extra):
super(SumWithDefaultSQL, self).__init__(col, default=default, **extra)
self.sql_function = 'SUM'
if default is not None:
self.sql_template = 'COALESCE(%(function)s(%(field)s), %(default)s)'
class SumWithDefault(Ag):
name = 'Sum'
def add_to_query(self, query, alias, col, source, is_summary):
aggregate = SumWithDefaultSQL(col, source=source, is_summary=is_summary, **self.extra)
query.aggregates[alias] = aggregate
final query:
Season.objects.values('name','match__matchresult__player__username').annotate(points=SumWithDefault('match__matchresult__points', default=0)).distinct().order_by('-points')