2009-12-26 18 views
7

Bağlantıların bir listesini çıkarıyorum ve bu bağlantıları popülerliğe göre sıralamaya çalışıyorum. Şimdi PostgreSQL ve Django kullanıyorumDjango'da karmaşık sipariş verme

(SUM(votes.karma_delta) - 1)/POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5) DESC 

tarafından sipariş kullanarak ben MySQL bu başarılı

 
Y Combinator's Hacker News: 
Popularity = (p - 1)/(t + 2)^1.5 

Votes divided by age factor. 
Where 

p : votes (points) from users. 
t : time since submission in hours. 

p is subtracted by 1 to negate submitter's vote. 
Age factor is (time since submission in hours plus two) to the power of 1.5.factor is (time since submission in hours plus two) to the power of 1.5. 

ve bir PHP Framework: Ben Hacker News algoritması kullanıyorum. Bu kesin SQL biliyorum muhtemelen işe yaramaz ama daha sonra dönüştürme yapabilirim. İçinde bulunduğum sorun, Django'da böyle karmaşık bir order_by'nin nasıl elde edileceğini bilmiyorum.

popular_links = Link.objects.select_related().annotate(karma_total = Sum('vote__karma_delta')) 

Ve gerçekten ben yoksa ham sql kullanarak o muck istemiyorum: Bence mükemmel vardır.

Sorumu özetlersek: Django'da nasıl karmaşık bir order_by oluşturabilirim?

DÜZENLEME

Orada sayfalandırma olmak ve gerçekten sadece ben çekin girişlerini sıralamak isteyecektir. Python'da bu sıralama yapmak gerçekten daha mı iyi?

cevap

5

Hiçbir temiz yolu ancak kullanılarak ekstra() özel SQL ile:

popular_links = Link.objects.select_related().annotate(karma_total = Sum('vote__karma_delta')) 
popular_links = popular_links.extra(
    select = {'popularity': '(karma_total - 1)/POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5)',}, 
    order_by = ['-popularity',] 
) 
+0

F ifadeleri ile bunu yapmak için bir wy olmalı? – JudoWill

+0

@JudiWIll Ne anlama geliyor? – TheLizardKing

+0

Bu bana bir istisna fırlatır: 'Oluşturma sırasında bir istisna yakalandı: sütun" karma_total "mevcut değil HAT 1: SELECT ((karma_total - 1)) AS" popular "," links_link "." Id ... " – TheLizardKing

0

Yine de tüm listeyi çekecekseniz (örneğin, yalnızca ilk 10 girişi almıyorsunuz), sonra sıralamayı Python'da yapabilirsiniz.

+0

Herhalde ben sayfalandırma planları var olduğuna dikkat edilmelidir. – TheLizardKing