Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中获取多维度的最新条目_Python_Django - Fatal编程技术网

Python 在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的值例如,

我有一个Django模型,看起来像这样:

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')