2009-06-29 25 views
44

Hesaplanmış bir değere göre sıralamak istediğim birkaç kayıt var. Ben bunu bir liste vermekdjango - listeyi bir queryset'e dönüştürün

class Profile(models.Model): 

    ... 

    @property 
    def reputation(self): 
     ... 

Maalesef jenerik görünümü bir QuerySet nesnesi bekliyor ve bir hata atar ise: ... cevabını over here var şöyle: Böyle bir Profil sınıfına

sorted(Profile.objects.all(), key=lambda p: p.reputation) 

.

ya ...

ben bir şekilde bir sorgu kümesi için bir liste dönüştürebilir miyim bir Sorgu Kümesi döndüren bunu yapmanın bir yolu var mı? Django dokümanlarında böyle bir şey bulunamadı.

Verileri denormalize etmemeyi umuyoruz, ama sanırım yapmam gerekecek.

Güncelleme/Cevap:

Eğer sql sorguları içine mantık bütün alabilirsiniz eğer geri Sorgu Kümesi almak için tek yol gibi görünüyor. Bu mümkün olmadığında

, (Bence) bir sorgu geri veri listesi dönüştürme hiçbir anlamı yoktur verileri

+2

gerçekleştirin Daha iyi bir soru "Bir listeyi (veya sözlüğü) genel bir görünüme nasıl geçirebilirim"? Bunu çözdüyseniz, o zaman bir queryset'e dönüştürüp dönüştürmediğinizi farketmezsiniz ... –

+0

evet ... öyle, ama sadece bunu dönüştürmenin kolay bir yolu olup olmadığını bilmek istedim. bir sorgulamadan çıkmadan önce genel görünümleri unutmak;) – Jiaaro

+2

modları, bu bir kopya değil. Cevabın, "bunu yapamazsın, başka bir şey yapmak zorundasın" diye sorduğumuz farklı bir soru. Diğer soruda "başka bir şey" açıklanmıştır. – Jiaaro

cevap

21

denormalize gerekir. Bir sorgu nesnesi asla veri tutmaz; Sadece veritabanına bir sorguyu temsil eder. Listenizi bir sorguya dönüştürdüğünüzde her şeyi tekrar almak zorunda kalacaksınız ve bu gereksiz ve çok kötü performansa sahip olacaktır.

Ne yapabilirsiniz:

  • reputation alan nasıl hesaplandığını açıklayın; Verileri veritabanında bir şekilde sipariş etmek muhtemelen olasıdır.
  • Bir sorgu nesnesi gerektirmeyen görünümü değiştirin. Ek filtreleme yapmak gerekiyorsa, bu sipariş herhangi bir sipariş vermeden önce yapılmalıdır, çünkü sipariş daha az girdiyle daha az zaman alacaktır (ve veritabanından daha az veri alınacaktır.) Böylece filtrelenmiş sorgu nesnesini sıralamaya gönderebilirsiniz. Eğer şablona göndermek hemen önce fonksiyon (bir sorgu veya bir liste olsun umurumda değil hangi.)
+2

itibarı bir özelliktir, bir alan değil ... bu yüzden geçerli değil – Jiaaro

+1

Bu durumda, bir alan olarak depolamanız gerekir (normalleştirilmiş veritabanlarında bile performansa yardımcı olursa yedek veriler her zaman kötü olmaz) veya siz başka bir şey tarafından sipariş vermelisiniz. Hesaplanmış veya birleştirilmiş bir alan olduğunu varsayalım ve bunları da Django veritabanı modeli ile sıralayabilirsiniz. – Blixt

+0

sadece bir fikrim vardı ... genel görünüm bir çeşit filtreleme yapmak istediğinden, neden bir şablon etiketiyle sıralama yapmıyoruz? – Jiaaro

70

Tamam ... Bu yazı şimdi eski ANCAK ne yapabileceğini olsun tüm ids olduğunu Listenizdeki nesneleri, sonra da model.objects.filter(pk__in=list_of_ids)

+1

Bu büyük koleksiyonlar için çok yavaş, ancak bir sorunu hızlı bir şekilde çözmek için ihtiyacım olan sınırlı durumda değerliydi. Özlü kod için güzel olabilecek nesnelerin listelerinde QuerySet yöntemlerini kullanmanıza olanak tanır. –

+17

Bunun dezavantajı, orijinal siparişi – yprez

+1

tutmayacak olmasıydı. Bu, hızlı bir prototip için iyi çalıştı, ama kesinlikle üretimde bunu tavsiye etmiyorum, çünkü @Blixt belirtilen nedenlerden dolayı. – kqr