Как получить правильный набор запросов для Datatable - PullRequest
1 голос
/ 15 января 2020

У меня есть две модели: профиль и оплата. И мне нужно показать на внешней стороне Datatable с полями «Имя пользователя», «Электронная почта» и «Всего потрачено». Имя пользователя и адрес электронной почты могут быть найдены в модели профиля, поэтому набор запросов будет иметь следующий вид:

def get_initial_queryset(self):
  return Profile.objects.all()

Однако информацию «Всего потрачено» необходимо рассчитать как сумму всех полей payment_amount, найденных в модели оплаты. для того же "profile_id", так как пользователь может иметь два платежа (один с суммой = 5 и другой с суммой = 15, и мне нужно показать total_spent = 20).

Проблема в том, что я я использую Datatables, я NEED это поле "total_spent" должно быть в наборе запросов (с использованием Annotate или другого метода).

Я пытался использовать подзапрос и OuterRef, но я получаю ошибки в конечном сгенерированном SQL.

return Profile.objects.all().annotate(
  money_spent=Subquery(
    Payment.objects.filter(user_id__in=OuterRef('id')).annotate(
      money_spent=Sum('amount')
    ),
    output_field=CharField()
  )
)

Но это дает мне SQL ошибку: (1241, «Операнд должен содержать 1 столбец (столбцы)»)

Как я могу получить правильный набор запросов?

Django Версия: 1.11 | Python Версия: 3.6.8

1 Ответ

2 голосов
/ 15 января 2020

Вам вообще не нужно выполнять подзапрос, вы можете проверить больше в документах, касающихся объединений и агрегатов

Profile.objects.annotate(money_spent=Sum('payment__amount'))

, что приведет к следующему

SELECT profile.*, SUM(payment.amount) AS money_spent
   FROM profile
   LEFT OUTER JOIN payment ON payment.profile_id = profile.id
   GROUP BY profile.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...