2011-07-26 16 views
5

Bunun en iyi örneklerle açıklanacağını düşünüyorum. Projenin en geç koşular her birinden bütün bir recordset elde edebilmek istiyorumGROUP BY'yi django 1.3'ün orm'unda kontrol edebilir miyim?

|project   | 
|id|name   | 
|1 |some project | 
|2 |my other project| 

|run         | 
|id|project_id|start_time |result | 
|1 |1   |1305732581845|something| 
|2 |1   |1305732593721|nothing | 
|3 |2   |1305732343721|nothing | 
|4 |2   |1305732556821|something| 

: Burada

gibi veri olur görüntüsü. SQL Sorgu böyle bir şey görünecektir:

SELECT *, MAX("run"."start_time") 
FROM "run"  
LEFT OUTER JOIN "project" ON ("run"."project_id" = "project"."id") 
GROUP BY "project"."id" 

bu harika projenin son dönemde, hem tablolar arasında bana tüm sütunları dönecektir, bu tam olarak neye ihtiyacım olduğunu.

Yani django 1.3 django orm eşdeğer bulmak için çalışırken ben sadece bunu yapmak için uygun bir yol bulamıyorum. Böyle bir şey yaparsanız: Bu ne istiyorum için yanlıştır tarafından grup olarak bana doğru sonuç döndürmez

SELECT 
"run"."id", "run"."result", "run"."project_id", "project"."id", "project"."name", 
MAX("run"."start_time") 
FROM "run" 
LEFT OUTER JOIN "project" ON ("run"."project_id" = "project"."id") 
GROUP BY "run"."id", "run"."result", "run"."project_id", "project"."id", "project"."name" 

:

Run.objects.annotate(Max('start_time')) 

oluşturulan SQL sorgusu gibi bir şey olacaktır. Ben düzgün ve açıkça sorguda maddesi ile grup kuracak aşağıdaki django önceki sürümlerinde inanıyoruz ama 1.3 çalışmaz görünmektedir: 1.3 yılında

q = Run.objects.annotate(Max('start_time')) 
q.query.group_by = [("project", "id")] 

bu el group_by değiştirerek değil tam olarak aynı sorgu oluşturur sorgudaki özellik.

Ben de bundan önce ve Açıklama() çağrısından sonra Değerler,() belgelenen davranışını temel mantıksal yolu denedik ama beklendiği gibi çalışmadı. Bu çalıştığımda:

q = Run.objects.values('project__id').annotate(Max('start_time')).values('id') 

Böyle bir sorgu ile sona erdi:

SELECT 
"run"."id", "run"."project_id" 
MAX("run"."start_time") 
FROM "run" 
LEFT OUTER JOIN "project" ON ("run"."project_id" = "project"."id") 
GROUP BY "run"."id", "run"."project_id" 

Herkes ben Aşağıdakilerden herhangi olmadan ne yapıyorum yapmak doğru şekilde bana gösterebilir:

  • Ham sql kullanımı - sürekli kendi sorgularımı oluşturmak zorunda kaldığımda bir orm kullanmanın amacı ne olurdu?
  • .extra'yı kullanma (select = {'latest': 'somequery'}) - alt sorgular olmadan mükemmel bir geçerli sorgu, istediğimi bana verebilirse neden alt sorguları kullanmalıyım?
  • Aynı verileri almak için birden çok sorguyu kullanmak - yine neden 1'de bulunan sonuçları almak için birden çok sorgu yapmam gerekir?

cevap

1

tl; dr: Django size fıkra Kontrol grubunda izin vermez ama o kadar ben istediğimi yapamam SQL tüm lezzetleri arasında çalışmak üzere sınırlar.

Ben Django ORM ile üretmek çalışıyorum orijinal sorgu aslında SQL tüm lezzetleri için geçerli olmadığını bana işaret edilmiştir.

SELECT *, MAX("run"."start_time") 
FROM "run"  
LEFT OUTER JOIN "project" ON ("run"."project_id" = "project"."id") 
GROUP BY "project"."id" 

bir kişinin aslında bir hata alırsınız MSSQL GROUP BY olmayan bir şey seçmek çalışırsa: İşte arıyordu sorgunun tazeleme olduğunu. Öyle görünüyor ki django aslında böyle bir sorgu oluşturmama izin vermemeliydi ve esasen problemimi yanlış bir şekilde çözmeye çalışıyorum.

0

Bu, belgelerin ek açıklama bölümünde oldukça kolay ve ayrıntılıdır ve önceki sürümde hiçbiri grubu elle ayarlayamazsınız.

YourModel.objects.values('this_is_your_group_by', 'even_a_second_field').annotate(sum=Sum('your_field')) 
+0

Bu, her satır için tüm kayıt kümesini döndürmez. Sadece değerler listesindeki sütunlardan değerleri verir. Bu, sütunlar tarafından gruplandırılmadan sütunlardan veri alamam ve maalesef, run ids'e ihtiyacım var demektir. – mockobject

+0

'değerleri ('gruplamalar, ...).) (Açıklama. Değerleri (' more_fields_to_show_here ') Eğer Gerçekten tamamını okumalıdır açıklama sonra değerleri terime açıklama tarafından eklenen alanın adını ekleyin emin olun https://docs.djangoproject.com/en/1.3/topics/db/aggregation/#order-of-annotate-and-values-clauses – John

+1

Bunun, belgelere dayanarak çalıştığım ilk yöntem olduğunu söylemeyi unuttum Bu gitmek için mantıklı yol gibi görünüyordu. Gerçi beklendiği gibi çalışmadı. Sonuncu değerlerdeki tüm değerler, group_by maddesinde sonlanır. Onunla çok yanlış bir şey yapmadan beklediğim gibi çalışmayacak belgelerini okudum. Bu soruyu denediğimi ve sonuçların ne olduğunu not etmek için asıl sorumu güncelleyeceğim, bu soruyu yazdığımda sadece bir gözetim oldu. – mockobject

İlgili konular