获取django中的多个维度的最新条目

时间:2015-12-14 18:48:44

标签: python django

我有一个看起来像这样的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

但这似乎有很多数据库命中,有没有办法用更少的触摸来做到这一点?

1 个答案:

答案 0 :(得分:2)

这应该在数据库中一次性完成(使用PostGreSQL测试):

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

order_by组相同field_x - 三元组与最新time_stamp首先,distinct然后仅为每个此类三元组选择第一行。这适用于您的简单模型,但在合并order_bydistinctvalues时通常需要谨慎:https://docs.djangoproject.com/en/1.9/ref/models/querysets/#django.db.models.query.QuerySet.distinct

编辑:更新了使用字段的pk的答案。当它们不是普通类型时,order_by不能正常工作。但是使用pk会得到正确的结果。