Skip to main content
 首页 » 编程设计

python之获取最新对象 django

2025年05月04日25yjmyzz

我认为已经问过很多类似的问题,但我无法做出复制粘贴的解决方案。那么问题来了:

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

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

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

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

我的报 TableView 现在需要一个集合,其中包含具有最近创建日期和唯一名称的记录。不幸的是 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')) 

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

编辑2:

现在我使用 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') 

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

请您参考如下方法:

你在找Max吗?

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