Django

2009-12-26 7 views
7

में जटिल आदेश तो मैं लिंक की एक सूची खींच रहा हूं और मैं इन लिंक को लोकप्रियता से सॉर्ट करने का प्रयास कर रहा हूं। एक आदेश का उपयोग करकेDjango

 
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. 

मैं MySQL में यह पूरा किया और एक PHP फ्रेमवर्क द्वारा

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

अब मैं PostgreSQL और Django उपयोग कर रहा हूँ: मैं हैकर समाचार कलन विधि का उपयोग कर रहा हूँ। मुझे पता है कि यह सटीक एसक्यूएल शायद काम नहीं करेगा लेकिन मैं बाद में कनवर्ट कर सकता हूं। जिस मुद्दे में मैं दौड़ रहा हूं वह मुझे नहीं पता कि Django में इस तरह के जटिल आदेश कैसे प्राप्त करें। मेरा विचार एक आदर्श है:

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

और मैं नहीं है वास्तव में उस गोबर के लिये कच्चे एसक्यूएल का उपयोग कर अगर मैं नहीं करना पड़ेगा द्वारा चाहते हैं।

मेरा प्रश्न संक्षेप में: मैं Django में जटिल ऑर्डर_बी कैसे बना सकता हूं?

संपादित

पृष्ठांकन नहीं लगेगा और मैं वास्तव में केवल वे ही प्रविष्टियां मैं खींच क्रमबद्ध करना चाहते हैं। क्या वास्तव में पाइथन में सॉर्टिंग करना बेहतर है?

उत्तर

5

कोई साफ रास्ता लेकिन उपयोग करने में अतिरिक्त() अपने कस्टम एसक्यूएल के साथ:

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

ऐसा लगता है कि एफ अभिव्यक्तियों के साथ ऐसा करने के लिए एक वाई होना चाहिए? – JudoWill

+0

@ जुडीWIll क्या मतलब है? – TheLizardKing

+0

यह मुझे अपवाद देता है: 'प्रतिपादन करते समय अपवाद पकड़ा गया: कॉलम "karma_total" मौजूद नहीं है लाइन 1: चुनें ((karma_total - 1)) "लोकप्रियता", "link_link" के रूप में। "आईडी ...' – TheLizardKing

0

यदि आप पूरी सूची को किसी भी तरह खींचने जा रहे हैं (यानी, आप केवल पहली 10 प्रविष्टियां नहीं ले रहे हैं), तो आप पाइथन में सॉर्टिंग कर सकते हैं।

+0

मैं शायद नोट करना चाहिए कि मैं पृष्ठांकन की योजना है। – TheLizardKing