【问题标题】:Django Multiple Annotations with HAVING, COUNT and AVG带有 HAVING、COUNT 和 AVG 的 Django 多注解
【发布时间】:2014-11-13 23:01:26
【问题描述】:

尝试显示基于 AVG 的 TOP 10 商业人气排行榜。一切正常,但我正在尝试添加其他条件,例如仅包括拥有至少 10 票的企业。

这适用于所有结果的 AVG:

Feedvote.objects.filter(site_id=settings.SITE_ID).annotate(
                        voteavg=Avg('feedvote')).order_by('-voteavg')[:10]

这里尝试添加至少 10 票的 HAVING 条件:

编辑:当我在下面运行此代码时,我什么也没有得到,没有错误,没有值。

Feedvote.objects.filter(city=settings.SITE_ID).annotate(
                       voteavg=Avg('feedvote')).annotate(
                       count_status=Count('business')).filter(
                       count_status__gt=10).order_by('-voteavg')[:10]

【问题讨论】:

  • 请描述您遇到的问题。
  • 当我使用COUNT 运行上面的代码时,我什么也没有得到,没有错误,没有值,什么都没有。
  • 如果您需要“至少 10 个”,那么您应该使用“__gte”而不是“__gt”
  • @shellbye 你是对的,但这并不能解决当 __gte 大于 1 时没有任何结果的问题。不知何故,它没有按业务 ID 对结果进行分组。

标签: python mysql sql django


【解决方案1】:

它正在生成不返回任何数据的 SQL。这是因为第二个注释调用是根据第一个结果计算的。您可以尝试将它们组合起来以避免这种情况。

Feedvote.objects.filter(city=settings.SITE_ID).annotate(
    voteavg=Avg('feedvote'),
    count_status=Count('business', distinct=True))

【讨论】:

  • 感谢您的反馈。与上述相同,除非count_status__gt0,否则我什么也得不到。运行少量测试,我得到的结果未按业务 ID 分组,显示所有计数 = 1。由于某种原因,查询未按业务 ID 对结果进行分组。
【解决方案2】:

我认为你应该把所有注释放在一起:

Feedvote.objects.filter(site_id=settings.SITE_ID).annotate(voteavg=Avg('feedvote'),count_status=Count('business')).filter(count_status__gte=10).order_by('-voteavg')[:10]

【讨论】:

    【解决方案3】:

    感谢所有回复!我把它全部启动并运行。问题是 Django 想要根据 Feedvote 表值查询 Business 表。在 SQL 中,我将使用Business 表作为JOIN 查询Feedvote 表。 Django 不想要。

    Business.objects.filter(city_id=settings.SITE_ID)
                    .annotate(count_status=Count('feedvotes__business'))
                    .filter(count_status__gte=10)
                    .annotate(voteavg=Avg('feedvotes__feedvote'))
                    .order_by('-voteavg')[:10] 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2011-10-11
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多