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