Подсчет строк, удовлетворяющих предикату в Django - PullRequest
2 голосов
/ 20 июня 2011

В Django у меня есть представление, в котором я хочу сгруппировать по полю не первичного ключа, а затем для каждой группы подсчитать количество строк, которые удовлетворяют предикату.Код, который я пробовал:

funding_requests=FRNs.objects.filter(spin=spin).extra(
    select={"approved": "committed_amount > 0",
            "denied": "committed_amount=0"}
).values("funding_year").annotate(
    requested=Sum('orig_commitment_request'), approved=Sum('committed_amount'),
    disbursed=Sum('total_authorized_disbursement'), num_requests=Count("funding_year"),
    num_approved=Sum('approved'), num_denied=Sum('denied')
)

, но я получаю сообщение об ошибке «Не удается разрешить ключевое слово« отказано »в поле».Я также попытался

funding_requests=FRNs.objects.filter(spin=spin).values("funding_year").annotate(
    requested=Sum('orig_commitment_request'), approved=Sum('committed_amount'),
    disbursed=Sum('total_authorized_disbursement'), num_requests=Count("funding_year")
).extra(
    select={"num_approved": "sum(committed_amount > 0)",
            "num_denied": "sum(committed_amount=0)"}
)

, и я не получаю сообщение об ошибке, но num_approved и num_denied отображаются на странице пустыми.Кто-нибудь знает, как получить количество строк, которые удовлетворяют данному предикату для каждой группировки.

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Это одна из самых неприятных вещей в новых агрегатных классах, предоставляемых django. Вы не можете использовать поля, добавленные с дополнительными в аннотациях (за исключением группирования). К сожалению, нет хорошего ответа.

Практически единственный ответ, который я мог бы дать, - использовать необработанный запрос и объединить результаты в python

0 голосов
/ 21 июня 2011

Вы, вероятно, не должны ограничивать вывод оператора SELECT values до annotate.

Вы пытались удалить .values("funding_year") и включить его в конце, если необходимо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...