Django SUM Query?
У меня есть запрос, похожий на следующее:
SELECT SUM(ISNULL(table.name)) FROM table
Как это SUM
перевести в QuerySet в Django? (т.е. какая операция xyz
это переводит, в чем-то вроде MyModel.objects.xyz()
?)
2 ответа
Обновление: следующее включает ISNULL аспект исходного запроса:
from django.db.models import Sum
ModelName.objects.filter(field_name__isnull=True).aggregate(Sum('field_name'))
Вы ищете функцию агрегирования Sum, которая работает следующим образом:
ModelName.objects.aggregate(Sum('field_name'))
См.: https://docs.djangoproject.com/en/dev/ref/models/querysets/
Вы также можете использовать псевдоним возвращаемого значения:
MyModel.objects.aggregate(total=Sum('field_1'))
который возвращает словарь, такой как{'total': 12345}
.
Если вам нужно отфильтровать суммируемые значения, другой способ — использоватьfilter=
параметрSum
объект черезQ
объект. Следующее возвращает общее количествоfield_1
значения, где соответствующиеfield_2
значения имеют значение null, т.е. эквивалент SQL-запроса.SELECT SUM(field_1) FROM table WHERE field_2 IS NULL
.
from django.db.models import Q, Sum
MyModel.objects.aggregate(total=Sum('field_1', filter=Q(field_2__isnull=True)))
Вы также можете использовать словарь для хранения суммы и распаковывать ее в качестве аргументов ключевого слова при передачеaggregate()
.
dct = {'total': Sum('field_1', filter=Q(field_2__isnull=True))}
MyModel.objects.aggregate(**dct)
оба из которых возвращают словарь, такой как{'total': 1234}
.