2015-02-23 7 views
3

Как бы сделать следующий запрос (в псевдокоде):Умножить два поля вместе в Джанго ОРМ

CueCompletion.objects.filter(
    user_id=profile_user.pk, status_action_taken_on__gte=day_ago 
).sum('amount' * 'opportunities') 

В принципе, я хочу, чтобы получить сумму в размере * возможности для вышеупомянутого запроса.

ответ

2

Одним из возможных способов достижения этого является использование метода Queryset под названием values_list.

Он возвращает определенный запрос (значение ValuesListQuerySet), а затем вы можете сделать некоторые дополнительные вычисления на нем.

Вы можете сделать это:

vqs = CueCompletion.objects.filter( user_id=profile_user.pk, status_action_taken_on__gte=day_ago ).values_list('amount','opportunities')

и тогда вы будете иметь что-то вроде vqs = [(50, 2), (100, 4), (25, 2), ...], то есть «список» из п кортежей, каждый со значением суммы и возможности поле.

(на самом деле vqs это не список, это ValuesListQuerySet, но не имеет значения для нашего следующего шага).


Наш следующий шаг (ака дальнейших вычислений) является:

total = sum(t[0] * t[1] for t in vqs)

, где мы используем встроенную его sum() функцию генератора, содержащий все наши (СУММА * возможности).

(почему использование генератора вместо списка понимания? Проверить this answer!)

+0

Вы заслуживаете медаль за это решение. – MiniGunnR

0

Можно также добавить аннотацию к QuerySet при использовании F объекта. Таким образом, вы выполняете все вычисления в базе данных, которые могут быть быстрее, чем перенос всех значений в список и выполнение понимания списка с использованием памяти python.

CueCompletion.objects.filter(
user_id=profile_user.pk, status_action_taken_on__gte=day_ago 
).annotate(total=F('amount') * F('opportunities')) 

Теперь вы можете получить это значение переменной total.