Ответ 1
На самом деле,
c = c.annotate(variance=F('metric')-F('metric_prior'))
работает так, как вам бы хотелось начиная с Django 1.8.
Мне нужно иметь возможность сортировать по совокупности двух аннотированных столбцов
Итак, я хотел бы сделать что-то вроде этого:
c = c.annotate(metric=Sum('results__metric'))
c = c.annotate(metric_prior=Sum('results__metric_prior'))
c = c.annotate(variance=F('metric')-F('metric_prior')) #doesn't work, for demonstrative purposes only
а затем:
c = c.order_by('variance')
Кто-нибудь знает, как выполнить что-то вроде выше?
На самом деле,
c = c.annotate(variance=F('metric')-F('metric_prior'))
работает так, как вам бы хотелось начиная с Django 1.8.
Ticket существует уже более 4 лет (к 2014 году), но это может быть выполнено с помощью небольшого запроса .extra()
например:
items = MyModel.objects.extra(
select = {'variance': 'SUM(relatedModel__someField) - SUM(relatedModel__someField)'},
)
Да, это может быть немного непредсказуемо для разных СУБД. Но если вы ограничиваете синтаксис внутри до очень распространенного SQL, он должен работать более или менее везде.