Python 在django中获取多维度的最新条目
我有一个Django模型,看起来像这样:Python 在django中获取多维度的最新条目,python,django,Python,Django,我有一个Django模型,看起来像这样: class MyModel(Model): field_1 = IntegerField() field_2 = IntegerField() field_3 = IntegerField() value = IntegerField() time_stamp = DateTimeField() 我想找到所有(field1,field2,field3)元组组合的最新条目,并从该行获取value的值例如,
class MyModel(Model):
field_1 = IntegerField()
field_2 = IntegerField()
field_3 = IntegerField()
value = IntegerField()
time_stamp = DateTimeField()
我想找到所有(field1,field2,field3)
元组组合的最新条目,并从该行获取value
的值例如,假设该表有以下行:
Field1, Field2, Field3, TimeStamp, Value
1 , 1 , 1 , 1/1/2015 , 1
1 , 1 , 1 , 1/2/2015 , 2
1 , 1 , 2 , 1/1/2015 , 3
2 , 2 , 2 , 1/1/2015 , 4
我希望查询结果返回行2,3,4
很明显,我可以这样做:
dims = MyModel.objects.values('field1', 'field2', 'field3').distinct()
for dim in dims:
row = MyModel.objects.filter(**dim).latest('time_stamp')
value = row.value
但是这看起来像是大量的数据库点击,有一种方法可以用较少的点击来实现吗?这应该在数据库中一次性完成(使用PostGreSQL测试):
order\u by
将相同的field\u x
-三元组与最新的时间戳一起分组,然后distinct
只为每个这样的三元组选择第一行。这适用于您的简单模型,但在按
组合order\u、distinct
和值时,通常需要谨慎:
编辑:更新答案以使用字段的主键。当它们不是普通类型时,order_by无法正常工作。但是,使用pk会给出正确的结果。这可能不起作用,但您可以尝试:MyModel.objects.values('field_1','field_2','field_3').distinct().annotate(latest=Max('time_stamp'))
?@ShangWang谢谢您的回复,我已经编辑了,以使我的问题更清楚(希望如此),如何使用您的方法保留每行的值
?您的保留每行的值
是什么意思?它是否与您提到的所有组合集相关?或者要显示每条记录的所有字段?因此,对于每个组合,字段1、字段2、字段3的元组
我想找到最新的行(由时间戳确定)并从该行获取值
。问题已被更新以反映这一愿望:MyModel.objects.value('field_1'、'field_2'、'field_3').distinct().Annotation(latest=Max('time_stamp')))。value('field_1'、'field_2'、'field_3'、'latest'、'value')
?我收到一些错误,说“在表达式上选择distinct必须按表达式匹配初始顺序”。尽管我的订单与您的相同(不包括时间戳)。任何输入?能够使其工作并更新答案,检查是您的!:)酷;)是的,如果它们不是整数域,那就更复杂了。
MyModel.objects.order_by('field_1__pk', 'field_2__pk', 'field_3__pk', '-time_stamp')
.distinct('field_1__pk', 'field_2__pk', 'field_3__pk')
.values('value')