2015-12-14 20 views
6

çok boyutta django en son girişi alma Bu satırdan value. Benim sorgu sonucunu isteyeyimBen şuna benzer bir Django modele sahip

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 

satırları2,3,4

Açıkçası böyle bir şey yapabileceğini dönmek için: Örneğin
tablo vardır aşağıdaki satırlar olur diyelim :

dims = MyModel.objects.values('field1', 'field2', 'field3').distinct() 
for dim in dims: 
    row = MyModel.objects.filter(**dim).latest('time_stamp') 
    value = row.value 

Ama DB çok vurur gibi o, orada daha az dokunuşları ile bunu yapmanın bir yolu görünüyor?

+0

Bu işe yaramayabilir, ancak şunları deneyebilirsiniz: “MyModel.objects.values ​​('field_1', 'field_2', 'field_3'). Distinct(). Not al (en son = Max ('time_stamp'))'? –

+0

@ShangWang Cevabınız için teşekkürler, sorumu daha açık (umarım) yapmak için düzenledim, yöntemle her satırın değerini nasıl koruyabilirim? – sedavidw

+0

Ne demek 'her satırın değerini koru'? Tüm kombinasyon kümelerinden bahsettiğiniz şey ile ilgili mi? Ya da her kayıt için tüm alanları göstermek ister misiniz? –

cevap

2

Bu (PostgreSQL ile test) veritabanına tek seferde bunu yapmalıdır:

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 grupları özdeş field_x -triplets birlikte son time_stamp ilk olan, distinct sonra her biri için sadece ilk satırı seçer bu üçlü. Bu basit model için çalışır, ancak tedbir genellikle gereklidir order_by, distinct ve values birleştirirken: https://docs.djangoproject.com/en/1.9/ref/models/querysets/#django.db.models.query.QuerySet.distinct

DÜZENLEME: alanların pk 's kullanmak cevabını güncellendi. Sıradan olmayanlar olduklarında, order_by düzgün şekilde düzgün çalışmaz. Ancak pk'in kullanılması doğru sonucu verir.

+0

"İçe aktarımda DISTINCT SELECT ORDER BY ifadeleriyle eşleşmesi gerekir" diyen bazı hatalar alıyorum. Her ne kadar ben aynı siparişi yapsam da (burada yaptığınız gibi zaman damgası hariç). Herhangi bir girdi var mı? – sedavidw

+0

Cevabı işe almak ve güncellemek mümkün oldu, kontrol sizindir! :) – sedavidw

+0

Cool;) evet, IntegerFields değilse, daha karmaşıktır. – schwobaseggl

İlgili konular