得到最新的对象django

时间:2013-01-08 10:51:09

标签: python django sqlite distinct

我认为已经提出过许多类似的问题,但我无法编写复制粘贴解决方案。所以这就是问题所在:

我会定期计算用户数据的分析以进行报告。我编写了一个模型来将这些计算存储在我的sqlite数据库中。

class report_data(models.Model):
    name = models.TextField()
    matrix = PickledObjectField()
    creation_date = models.DateTimeField('date of creation')

我正在使用仅附加方案来保存历史数据,因此数据库中有许多记录

  • 同名
  • 不同的矩阵
  • 不同的创作日期

我的报告视图现在需要一个集合,其中包含具有最新创建日期和唯一名称的记录。遗憾的是,sqlite不支持DISTINCT ON,而我找到的解决方案here无法确定它始终是最新的矩阵,是吗?

report_data.objects.all().distinct()

也不起作用,因为这些记录都是由密钥区分的。和

一样
report_data.objects.all().latest("creation_date")

不起作用,因为它只返回最近的一个元素而不考虑name列。

我是django的初学者,在SQL中我会尝试像

这样的东西
SELECT max(date),name,matrix FROM report_data group by name

但我没有测试过这个。

编辑:

通过评论讨论的支持,我制定了某种解决方案,如下所示:

a = report_data.objects.values('name').annotate(latest=Max('creation_date'))

然后,我得到了所有正确的创建日期,但是如何获取带注释的对象?

EDIT2:

现在我使用ReportManager,如下所示:

class ReportManager(models.Manager):
    def recent(self):
        a = report_data.objects.values("name").annotate(latest_id=Max('id'))
        a = list(v['latest_id'] for v in a)
        return report_data.objects.filter(id__in=a).order_by('-creation_date')

但我对这个解决方案不太满意。感谢您发布真实解决方案!

1 个答案:

答案 0 :(得分:0)

您在寻找Max吗?

from django.db.models import Max # also available: Q, Count, Min, Sum, Avg, StdDev, Variance, ...
report_data.objects.all().aggregate(Max('creation_date'))