2015-12-14 32 views
6

我有一個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 

,但似乎像很多DB的命中,有沒有辦法用更少的觸摸來做到這一點?

+0

這可能不起作用,但你可以試試:'MyModel.objects.values('field_1','field_2','field_3')。distinct()。annotate(latest = Max('time_stamp'))'? –

+0

@ShangWang感謝您的回覆,我已經編輯好讓我的問題更加清晰(希望),我怎樣才能用您的方法保留每行的「價值」? – sedavidw

+0

你是什麼意思'保留每行的價值?它是否涉及你提到的「所有組合」?或者你想顯示每個記錄的所有字段? –

回答

2

這應該在數據庫(PostgreSQL的測試)做一氣呵成:採用最新time_stamp第一

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 -triplets在一起,distinct然後選擇只針對第一行這樣的三聯體。這適用於你的簡單模型,但一般需要謹慎相結合order_bydistinctvalues時:https://docs.djangoproject.com/en/1.9/ref/models/querysets/#django.db.models.query.QuerySet.distinct

編輯:更新中使用的字段的PK的答案。當它們不是普通類型時,order_by不能正常工作。但是使用pk給出正確的結果。

+0

我收到一些錯誤,說「表達式上的SELECT DISTINCT必須匹配intial ORDER BY表達式」。儘管我正在做同樣的訂單(不包括時間戳,因爲您已經在這裏完成)。任何輸入? – sedavidw

+0

能夠得到它的工作和更新答案,檢查是你的! :) – sedavidw

+0

酷;)是的,如果他們不是IntegerFields,它更復雜。 – schwobaseggl