Django ORM:如何在带注释的计数器上使用

时间:2018-11-15 19:45:14

标签: python django django-orm

tltr

考虑电子邮件列表:

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。 我希望每个用户都能得到以下结果:

a@a.com-3

b@a.com-2

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 :(得分:2)

好吧,您不会用Counter做到这一点,Counter是一个Python类,用于对现有Python集合中的不同项目进行计数。您需要使用Django Count函数:

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

答案 1 :(得分:0)

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字段中。