django

2009-05-30 7 views
5

में एक गणना मूल्य द्वारा सॉर्ट करने के लिए कैसे करें मैं django में एक गणना मूल्य के आधार पर वस्तुओं को सॉर्ट करना चाहता हूं ... मैं इसे कैसे कर सकता हूं?django

class Profile(models.Model): 
    user = models.ForeignKey(User) 

    def get_reputation(): 
     ... 
     return reputation 
    reputation = property(get_reputation) 

तो, मैं प्रतिष्ठा से उन क्रमबद्ध करना चाहते हैं कहते हैं:

यहाँ ढेर अतिप्रवाह कि मेरी स्थिति बताते हैं के आधार पर एक उदाहरण उपयोगकर्ता प्रोफ़ाइल मॉडल है। मैं उसको कैसे करू? मैं जानता हूँ कि तुम सिर्फ यह नहीं कर सकता:

Profile.objects.order_by("-reputation") 

धन्यवाद के लिए आपकी मदद की हर कोई :)

उत्तर

3

आप (क्योंकि आप रिकॉर्ड के बहुत सारे है, और उन्हें पृष्ठ पर अंक लगाना जैसे की जरूरत है) डेटाबेस में छंटाई करने के लिए की जरूरत है, केवल वास्तविक विकल्प के लिए एक denormalized क्षेत्र (जैसे एक अधिरोहित save() में अद्यतन में प्रतिष्ठा चालू करने के लिए है मॉडल पर विधि)।

+2

+1: इस फ़ील्ड को अद्यतित रखने के लिए बस सहेजें() को ओवरराइड करें। –

+0

मैंने सहेजने के बजाय पोस्ट-सेव सिग्नल का उपयोग करने का निर्णय लिया है() ... क्या उस संभावित दृष्टिकोण के बारे में मुझे पता होना चाहिए? – Jiaaro

+0

यदि आप संकेतों का उपयोग करना चाहते हैं, तो मैं post_save के बजाय pre_save की अनुशंसा करता हूं। Post_save के साथ अद्यतित एक अपरिवर्तित फ़ील्ड को रखने के लिए आपको दो अद्यतन क्वेरी करना है जहां कोई पर्याप्त होगा। –

16

अपने गणना कोड केवल अजगर के भीतर मौजूद है के बाद से, आप के रूप में अच्छी अजगर में छंटाई प्रदर्शन करने के लिए है:

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

हे, यह सवाल मैंने पूछा है, लेकिन मैंने दूसरे को स्वीकार कर लिया क्योंकि यह मेरी समस्या का समाधान करता है ... विशेष रूप से एसएलॉट की टिप्पणी। मैंने आपके जवाब को फिर से बढ़ाया :) – Jiaaro

+0

क्या यह एक नियमित पायथन सूची (या एक क्वेरीसेट में एक सूची को परिवर्तित करने) की बजाय एक क्वेरीसेट लौटने का कोई तरीका है? – Jiaaro

+0

यह एक टिप्पणी में पूछने के लिए थोड़ा भारी लगता है, इसलिए मैंने इसे अपने स्वयं के प्रश्न पर ले जाया: http://stackoverflow.com/questions/1058135/django-convert-a-list-back-to-a-queryset – Jiaaro

5

Django-1.8 के रूप में, query expressions का उपयोग करके क्वेरीरीसेट को सॉर्ट करना संभव है जब तक गणना गणना मूल्य एसक्यूएल में प्रस्तुत की जा सके। आप order_by शब्द के रूप में मॉडल में annotations का भी उपयोग कर सकते हैं। +, -, *, / और ** तरह

from django.db.models import F 
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation") 

बेसिक संचालन F() के साथ प्रयोग किया जा सकता है। इसके अलावा कुछ अन्य कार्य देखते हैं इस तरह के Count, Avg, Max के रूप में, ...

लिंक:

भी देखें इस अतः क्यू & ए: Order a QuerySet by aggregate field value