73 votes

Django Query Related Field Count (en anglais)

J'ai une application où les utilisateurs créent des pages. Je veux exécuter une simple requête DB qui renvoie le nombre d'utilisateurs ayant créé plus de 2 pages.

C'est essentiellement ce que je veux faire, mais bien sûr, ce n'est pas la bonne méthode :

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

Qu'est-ce que je rate ?

137voto

Ismail Badawi Points 10898

Vous devez utiliser agrégats .

from django.db.models import Count
User.objects.annotate(page_count=Count('page')).filter(page_count__gte=2).count()

0 votes

Est-il possible de combiner (puisque j'en ai besoin comme jeu de questions pour mon administration) une annotation comptant l'occurrence d'un élément lié et une annotation comptant les éléments correspondant à une valeur exacte ? Ce qui suit ne fonctionne pas pour moi : 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"'))

3voto

Yarik Points 160

Dans mon cas, je n'ai pas utilisé de dernier .count() comme le autre réponse et ça marche bien aussi.

from django.db.models import Count

User.objects.annotate( our_param=Count("all_comments")).filter(our_param__gt=12)

0voto

wildmental Points 1

Utiliser la fonction aggregate() avec les méthodes django.db.models ! c'est tellement utile et pas vraiment écrasant avec d'autres colonnes agrégées par annotation. *utiliser aggregate() à la dernière étape du calcul, cela transforme votre queryset en dict.

Voici mon extrait de code qui les utilise.

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"))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X