Как получить единственное значение от генератора? - PullRequest
0 голосов
/ 28 апреля 2018

Я пишу приложение для отслеживания случаев смерти цыплят на птицеферме и получаю следующий код:

today = datetime.date.today()
deaths = (sum(cd.count) for cd in ChickenDeath.objects.filter(date__gte=datetime.date(today.year, today.month, 1)))
print(deaths)

Моя проблема в том, что он просто печатает <generator object chickens_overview.<locals>.<genexpr> at 0x110010678> вместо фактической суммы. Я также пробовал next(deaths), но я получаю ошибку 'int' object not iterable. Есть ли другой способ получить значение из этого генератора?

1 Ответ

0 голосов
/ 28 апреля 2018

Тебе вообще не следует возвращать генератор. Генератор должен быть входом для функции суммы.

На данный момент вы фактически создаете список элементов, каждый из которых представляет собой «сумму» одного значения. Вот почему вы получаете ошибку о не повторяемости; это cd.count, которое не повторяется, потому что это одно значение, и вы не можете его суммировать.

Я подозреваю, что вы имели в виду сложение всех подсчетов:

deaths = sum(cd.count for cd in ChickenDeath.objects.filter(...))

но это не правильно. Вы должны попросить базу данных сделать сумму для вас:

from django.db.models import Sum
deaths = ChickenDeath.objects.filter(...).aggregate(total=Sum('count'))
print(deaths['total'])
...