Django ORM: как использовать Counter с аннотацией - PullRequest
0 голосов
/ 15 ноября 2018

транслятор

С учетом списка писем:

list = ['a@a.com', 'b@a.com', 'b@a.com', 'a@a.com', 'c@a.com', 'a@a.com']

Учитывая набор запросов Пользователей, использующих эти электронные письма, как я могу использовать аннотацию для подсчета вхождений электронных писем Пользователей в этом списке?

Если я попробую это:

users = User.objects.all()
users.values('email').annotate(email_in_list=Count('email))

результат равен 1 для каждого пользователя. Я ожидаю эти результаты для каждого пользователя:

* 10101 * a@a.com - 3 * 10101 * b@a.com - 2 * 10101 * c@a.com - 1

Начальный вопрос

Я хочу посмотреть, сколько у зарегистрированных пользователей есть пользователь:

refered_user = Profile.objects.filter(user__groups__name="Refered")
list = refered_user.values_list('referer_email')

# Getting all the referers who  actually had refered users
referer_users = Profile.objects.filter(user__groups__name="Referer", user__email__in=list)

Теперь, как я могу узнать, сколько у реферируемых пользователей есть реферер?

Я пробовал это безуспешно:

counter = Counter(refered_user)
referer_users.values('user__email').annotate(refered_num=counter['user__email'])

По запросу, вот модели:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    referer_email = models.CharField(verbose_name='Email Referer', max_length=99, blank=True)

РЕДАКТИРОВАТЬ: с учетом Count ()

Я пробовал это:

referer_users.values('user__email').annotate(refered_num=count('user__email'))

Но значение refered_num всегда равно 1, что логично, поскольку в запросе refered_num у нас есть только объекты User с одним адресом электронной почты для каждого.

Как я могу посчитать вхождения электронной почты реферера в списке refered_user и аннотировать его в моем запросе referer_users?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018
from django.db.models import Count
referer_users = referer_users.order_by()
referer_users = referer_users.values('email')
referer_users = referer_users.annotate(refered_num=Count('email'))

Я думаю, что вы добавляете order_by('id'), и поэтому он дает 1. При добавлении заказа он также добавляется к group by полям.

0 голосов
/ 15 ноября 2018

Ну, вы бы не сделали это с Counter, это класс Python для подсчета различных элементов в существующей коллекции Python.Вам нужно использовать функцию Django Count:

from django.db.models import Count
referer_users.values('email').annotate(refered_num=Count('email'))
...