extra, - , , , 0 , ( - , COALESCE - COALESCE(SUM(value), 0) - ):
pictures = gallery.picture_set.extra(
select={
'score': 'SELECT SUM(value) FROM yourapp_picturevote WHERE yourapp_picturevote.picture_id = yourapp_picture.id',
},
order_by=['-score']
)
SQL ( ), , , :
from django.db.models import aggregates
from django.db.models.sql import aggregates as sql_aggregates
class SumWithDefault(aggregates.Aggregate):
name = 'SumWithDefault'
class SQLSumWithDefault(sql_aggregates.Sum):
sql_template = 'COALESCE(%(function)s(%(field)s), %(default)s)'
setattr(sql_aggregates, 'SumWithDefault', SQLSumWithDefault)
, django.db.models.sql.aggregates - , SQL, , , , Sum, hardcoding COALESCE , ( , ).
:
pictures = gallery.picture_set.annotate(score=SumWithDefault('picturevote__value', default=0).order_by('-score')