Django按时间序列中的ID过滤和选择每个月的最后一条记录的方法?
Posted
技术标签:
【中文标题】Django按时间序列中的ID过滤和选择每个月的最后一条记录的方法?【英文标题】:Django way to filter and select the last record for each month by ids in a time series? 【发布时间】:2016-10-02 21:17:39 【问题描述】:我有一个时间序列数据存储在 postgres 中。在给定视频 ID 的情况下,我想查看每个月最后记录的观看次数。
VideoID | created | views
1 2015-01-01 5
2 2015-01-01 5
1 2015-01-15 20
1 2015-01-28 30
2 2015-02-01 40
1 2015-02-01 50
1 2015-02-26 60
1 2015-03-05 100
给定模型
from django.db import models
class Video(models.Model):
id = models.IntegerField()
class VideosStats(models.Model):
video_id = models.ForeignKey(Video)
views = models.IntegerField()
我知道有类似的 SQL 问题,但我想知道在 django 中是否可以实现此效果。期望的输出:
视频 ID 1 ['created': 2015-01-28, 'views': 30, 'created': 2015-02-26, 'views': 60, 'created': 2015-03-05, 'views ': 100]
【问题讨论】:
到目前为止你尝试了什么? 如果您想要一个原始 sql 查询来发布表结构是正确的做法,但您要求的是 orm 查询,那么您不应该发布模型吗? 该表反映了模型@e4c5,发布该表可帮助您了解数据的结构。在我看来,这是一个更好的视觉效果。我没有尝试过任何事情,因为我认为这是不可能的。 也很好奇为什么这被否决了 如果您希望我们将您的表格转换为模型,您还有另一个想法。 【参考方案1】:因此,给定一年,您可以在查询集上执行额外/提取过滤器,为您提供每个视频每个月的最新记录。
the_year = 2016 # the year you want
queryset = VideoStats.filter(created__year=the_year)
queryset = queryset.extra(select='month': "EXTRACT(month from created)").values('month').annotate(Max('views')).order_by('month')
【讨论】:
以上是关于Django按时间序列中的ID过滤和选择每个月的最后一条记录的方法?的主要内容,如果未能解决你的问题,请参考以下文章