Фильтрация по счету с помощью Django ORM - PullRequest
7 голосов
/ 26 сентября 2010

У меня есть запрос, который в основном «считает все элементы типа X и возвращает элементы, которые существуют более одного раза, вместе с их количеством». Прямо сейчас у меня есть это:

Item.objects.annotate(type_count=models.Count("type")).filter(type_count__gt=1).order_by("-type_count")

но ничего не возвращает (количество равно 1 для всех предметов). Что я делаю не так?

В идеале должно получиться следующее:

Type
----
1
1
2
3
3
3

и возврат:

Type, Count
-----------
1     2
3     3

Ответы [ 2 ]

16 голосов
/ 26 сентября 2010

Для подсчета количества вхождений каждого типа необходимо сгруппировать по полю type. В Django это делается с помощью values, чтобы получить только это поле. Итак, это должно работать:

Item.objects.values('group').annotate(
     type_count=models.Count("type")
).filter(type_count__gt=1).order_by("-type_count")
2 голосов
/ 26 сентября 2010

Это логическая ошибка;)

type_count__gt=1 означает type_count > 1, поэтому, если count == 1, оно не будет отображаться :) используйте type_count__gte=1 вместо - это означает type_count >= 1:)

...