Django: распаковать список аргументов для использования в совокупном запросе - PullRequest
0 голосов
/ 20 февраля 2010

Я пытаюсь создать полудинамическую статистическую функцию, которая будет возвращать суммы всех полей в списке. Предполагается, что выполнение get_query_set () вернет отфильтрованный запрос, который содержит все поля в списке и некоторые другие, которые могут не очень хорошо работать с агрегатом Sum (поля даты, поля символов, внешние ключи и т. Д.)

Лучшие примеры, которые я до сих пор приводил, приведены ниже, это в основном вопрос по питону с использованием Django, хотя мой Python-Fu еще не самый сильный ...

Работает

qs = cl.get_query_set().aggregate(Sum('permits_submitted'), Sum('permits_pulled'), Sum('permits_posted'))

возвращение: {'permits_pulled__sum': 5772, 'permits_posted__sum': 6723, 'permits_submitted__sum': 7276}

не работает

qs = cl.get_query_set().aggregate(Sum('permits_submitted')).aggregate(Sum('permits_pulled'))

возврат: ошибка

qs = cl.get_query_set().aggregate(Sum('permits_submitted', 'permits_pulled', Sum('permits_posted'))

возврат: ошибка

Не работает - представляет идею

tuple = (
        'permits_submitted',
        'permits_pulled',
        'permits_posted',
    )

qs = cl.get_query_set()
for field in tuple:
    qs.aggregate(Sum(field))

возврат: ошибка

qs = cl.get_query_set()
qs.aggregate(*[Sum(field) for field in tuple])

возврат:

[<permit_runner: User's report for 2010-02-18>, <permit_runner: User's report for 2010-02-19>, '...(remaining elements truncated)...'] 

(аналогично возврату без агрегирования)

РАБОТА

qs = cl.get_query_set()
qs = qs.aggregate(*[Sum(field) for field in tuple])

пропустил определение qs = при добавлении агрегации - помогает сделать перерыв на несколько минут и выглядеть свежо

1 Ответ

3 голосов
/ 22 декабря 2011

Начиная с этой работы, я назвал это ответом, чтобы люди могли легко найти его, когда гуглят:

qs = cl.get_query_set()
qs = qs.aggregate(*[Sum(field) for field in tuple])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...