【问题标题】:Django get most recent value AND aggregate valuesDjango获取最新值和聚合值
【发布时间】:2019-01-15 21:41:15
【问题描述】:

我有一个模型,我想从中获取最新的值,即最近添加的项目中的值,以及一段时间内的聚合值。我可以在单独的 QuerySet 中获得答案,然后在 Python 中将它们联合起来,但我觉得应该有更好的 ORM 方法来解决这个问题。有谁知道怎么弄?

简化示例:

Class Rating(models.Model):
     movie = models.ForeignKey(Movie, related_name="movieRatings")
     rating = models.IntegerField(blank=True, null=True)
     timestamp = models.DateTimeField(auto_now_add=True)

我希望获得过去一个月的平均评分和每部电影的最新评分。

目前的做法:

recent_rating = Rating.objects.order_by('movie_id','-timestamp').distinct('movie')
monthly_ratings = Rating.objects.filter(timestamp__gte=datetime.datetime.now() - datetime.timedelta(days=30)).values('movie').annotate(month_rating=Avg('rating'))

然后我需要以某种方式加入他们的电影 ID。

谢谢!

【问题讨论】:

    标签: python django django-models orm django-queryset


    【解决方案1】:

    我建议您使用@property 装饰器向您的评分模型添加一个属性方法(monthly_rating),而不是在您的views.py 中计算它:

    @property
    def monthly_rating(self):
        return 'calculate your avg rating here'
    

    【讨论】:

      【解决方案2】:

      根据Subquery expressions试试这个解决方案:

      from django.db.models import OuterRef, Subquery, Avg, DecimalField
      
          month_rating_subquery = Rating.objects.filter(
              movie=OuterRef('movie'),
              timestamp__gte=datetime.datetime.now() - datetime.timedelta(days=30)
          ).values('movie').annotate(monthly_avg=Avg('rating'))
      
          result = Rating.objects.order_by('movie', '-timestamp').distinct('movie').values(
              'movie', 'rating'
          ).annotate(
              monthly_rating=Subquery(month_rating_subquery.values('monthly_avg'), output_field=DecimalField())
          )
      

      【讨论】:

        猜你喜欢
        • 2019-08-03
        • 1970-01-01
        • 2021-03-21
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 2017-08-31
        • 2015-09-25
        相关资源
        最近更新 更多