【问题标题】:Django: Average of Subqueries as Multiple Annotations on a Query ResultDjango:子查询的平均值作为查询结果的多个注释
【发布时间】:2020-07-27 22:21:45
【问题描述】:

我有三个 Django 模型:

class Review(models.Model):
  rating = models.FloatField()
  reviewer = models.ForeignKey('Reviewer')
  movie = models.ForeignKey('Movie')

class Movie(models.Model):
  release_date = models.DateTimeField(auto_now_add=True)

class Reviewer(models.Model):
  ...

我想编写一个查询,为每个审阅者返回以下内容:

  • 审阅者的 ID
  • 他们对最近上映的 5 部电影的平均评分
  • 他们对最近上映的 10 部电影的平均评分
  • 他们评分为 3 分(满分 5 分)或以下的最新电影的上映日期

结果将被格式化:

<Queryset [{'id': 1, 'average_5': 4.7, 'average_10': 4.3, 'most_recent_bad_review': '2018-07-27'}, ...]>

我熟悉使用.annotate(Avg(...)),但我不知道如何编写一个仅对潜在值的子集进行平均的查询。同样,我不知道如何为最近的

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    所有这些基本上只是 python 代码中的一些 if 语句和数据库中的 when 语句假设它是类似 SQL 的,所以,你可以使用 django 的内置 CaseWhen 函数,你会可能在您的情况下将它们与 Avg 结合起来,并且每次都需要一个新的注释字段,因此您的查询集看起来大致像

    Model.objects.annotate(
        average_5=Avg(Case(When(then=...), When(then=...)),
        average_10=Avg(Case(When(then=...), When(then=...)),
    )
    

    在 when 和适当的 then 值中包含适当的条件。

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 2020-09-06
      • 2011-03-09
      • 2019-10-12
      • 1970-01-01
      • 2020-01-18
      相关资源
      最近更新 更多