【问题标题】:Django ORM : How to use Counter with annotateDjango ORM:如何使用带注释的计数器
【发布时间】:2019-04-18 23:51:00
【问题描述】:

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 查询中对其进行注释?

【问题讨论】:

  • 你能分享你的模型吗?
  • 我已经编辑了我的问题,包括模型

标签: python django django-orm


【解决方案1】:

好吧,你不会用 Counter 来做,这是一个 Python 类,用于计算现有 Python 集合中的不同项目。你需要使用Django的Count函数:

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

【讨论】:

  • 感谢您的回答。我首先尝试过这个,但是对于每个referer_users,refered_num 等于1。也许应该再试一次。
  • 不幸的是,它不起作用。我已经相应地编辑了我的问题。
  • 你好丹尼尔,我试图重新表述我的问题。我觉得我不够清楚。
【解决方案2】:
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 字段中。

【讨论】:

  • 我没有使用order_by()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 2019-05-13
  • 2012-03-07
  • 2020-12-10
  • 2019-01-22
  • 2017-03-03
相关资源
最近更新 更多