Количество полей, связанных с запросом Django

У меня есть приложение, в котором пользователи создают страницы. Я хочу запустить простой запрос к БД, который возвращает, сколько пользователей создали более двух страниц.

По сути, это то, что я хочу сделать, но, конечно, это неправильный метод:

User.objects.select_related('page__gte=2').count()

Что мне не хватает?


person Brenden    schedule 29.06.2011    source источник


Ответы (3)


Вы должны использовать агрегаты.

from django.db.models import Count
User.objects.annotate(page_count=Count('page')).filter(page_count__gte=2).count()
person Ismail Badawi    schedule 29.06.2011
comment
Можно ли объединить (так как он мне нужен как набор запросов для моего администратора) одну аннотацию Подсчет наличия связанного элемента и аннотации Подсчет элементов, соответствующих точному значению? У меня не работает следующее: super(ModelAdmin, self).queryset(request ).annotate(o_count=Count('v__g_o') ).annotate(timedout_o_count=Count('v__g_o__d_t__exact="AUTO_DECLINE"')) - person Rmatt; 01.07.2013

В моем случае я не использовал последний .count() как другой ответ и это тоже хорошо работает.

from django.db.models import Count

User.objects.annotate( our_param=Count("all_comments")).filter(our_param__gt=12)
person Yarik    schedule 24.06.2017

используйте функцию aggregate () с методами django.db.models! это так полезно и не особо сложно с другими агрегированными столбцами аннотаций. * используйте aggregate () на последнем этапе расчета, он превращает ваш запрос в dict.

ниже мой фрагмент кода, использующий их.

cnt = q.values("person__year_of_birth").filter(person__year_of_birth__lte=year_interval_10)\
               .filter(person__year_of_birth__gt=year_interval_10-10)\
               .annotate(group_cnt=Count("visit_occurrence_id")).aggregate(Sum("group_cnt"))
person wildmental    schedule 03.04.2021