获取最新对象django

问题描述:

我认为很多类似的问题已经被问到,但我无法制作复制粘贴解决方案。所以这里是问题:获取最新对象django

我定期计算我的用户数据分析报告。我编写了一个模型将这些计算存储在我的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') 

但我不是这种解决方案非常高兴。感谢您发布真实解决方案!

+0

您是否找到针对此问题的其他解决方案?如果'a'很大,过滤器(id__in = a)可能会变得混乱。 –

您是在查找Max

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

这太棒了!这几乎是我正在寻找的。这将返回最大值,而不是对象本身。这也在这里讨论:http://*.com/questions/844591/how-to-do-a-select-max-in-django,但是'a = report_data.objects.all()。aggregate(Max ('creation_date')); result = report_data。objects.get(creation_date = a)'一个好的解决方案?我认为这是不确定的,它总是返回相同的.. –