2009-06-29 19 views
44

मेरे पास कुछ हद तक रिकॉर्ड्स हैं जिन्हें मैं गणना किए गए मान के आधार पर सॉर्ट करना चाहता हूं। अगर मैं इसे एक सूची देdjango - एक सूची को एक क्वेरीसेट में वापस कनवर्ट करें

class Profile(models.Model): 

    ... 

    @property 
    def reputation(self): 
     ... 

दुर्भाग्य से सामान्य दृश्य एक क्वेरीसमूह वस्तु की उम्मीद और एक त्रुटि फेंकता है: ... जवाब over here गया तो जैसे:

sorted(Profile.objects.all(), key=lambda p: p.reputation) 
इस तरह एक प्रोफाइल वर्ग पर

इस है कि एक क्वेरीसमूह

या ...

मैं एक क्वेरीसमूह किसी भी तरह के लिए एक सूची परिवर्तित कर सकते हैं देता है करने के लिए एक तरीका है? django docs में ऐसा कुछ नहीं मिला।

मुझे उम्मीद है कि डेटा को denormalize नहीं है, लेकिन मुझे लगता है कि अगर मुझे करना होगा तो मुझे लगता है।

अपडेट/उत्तर:

ऐसा लगता है कि एक क्वेरीसमूह वापस पाने के लिए एक ही रास्ता आप एसक्यूएल प्रश्नों में अपने तर्क के सभी प्राप्त कर सकते हैं है।

जब यह संभव नहीं है, (मुझे लगता है कि) आप डेटा

+2

एक बेहतर सवाल नहीं है "मैं एक सामान्य दृश्य में एक सूची (या शब्दकोश) कैसे पास कर सकता हूं"? मुझे लगता है कि अगर आपने इसे हल किया है तो इससे कोई फर्क नहीं पड़ता कि आपने इसे एक क्वेरीसेट में परिवर्तित करके किया है या नहीं ... –

+0

हाँ ... यह है, लेकिन मैं सिर्फ यह जानना चाहता था कि इसे बदलने के लिए एक आसान तरीका है या नहीं जेनेरिक विचारों को छोड़ने से पहले एक क्वेरीसेट;) – Jiaaro

+2

मोड, यह एक डुप्लिकेट नहीं है। यह एक अलग सवाल है जिसका जवाब है, "आप ऐसा नहीं कर सकते हैं, इसलिए आपको कुछ और करना है।" दूसरे प्रश्न में "कुछ और" वर्णित है। – Jiaaro

उत्तर

21

एक सवाल के एक डेटा सूची परिवर्तित वापस करने का कोई मतलब नहीं है denormalize की जरूरत है। एक क्वेरी ऑब्जेक्ट डेटा कभी नहीं रखता है; यह सिर्फ डेटाबेस के लिए एक क्वेरी का प्रतिनिधित्व करता है। यदि आपने अपनी सूची किसी प्रश्न में की है, तो उसे सबकुछ फिर से प्राप्त करना होगा, और यह अनावश्यक और बहुत खराब प्रदर्शन-वार होगा।

आप क्या कर सकते हैं:

  • तरीके का वर्णन करें reputation क्षेत्र गणना की जाती है; किसी भी तरह डेटाबेस में डेटा ऑर्डर करना शायद संभव है।
  • किसी क्वेरी ऑब्जेक्ट की आवश्यकता के लिए दृश्य को संशोधित करें। यदि इसे अतिरिक्त फ़िल्टरिंग आदि करने की आवश्यकता है तो इसे किसी ऑर्डरिंग से पहले किया जाना चाहिए, क्योंकि ऑर्डरिंग में कम प्रविष्टियों के साथ कम समय लगेगा (और डेटाबेस से कम डेटा प्राप्त किया जाएगा।) तो आप फ़िल्टर किए गए क्वेरी ऑब्जेक्ट को सॉर्ट कर सकते हैं समारोह सिर्फ इससे पहले कि आप टेम्पलेट के लिए भेजने के लिए (जो परवाह नहीं करना चाहिए कि क्या यह एक प्रश्न या एक सूची है।)
+2

प्रतिष्ठा एक संपत्ति है, फ़ील्ड नहीं ... इसलिए यह वैध नहीं है – Jiaaro

+1

ठीक है, उस स्थिति में, आपको या तो इसे एक फ़ील्ड के रूप में स्टोर करना चाहिए (अनावश्यक डेटा हमेशा खराब नहीं होता है अगर यह प्रदर्शन में मदद करता है, यहां तक ​​कि सामान्यीकृत डेटाबेस में भी) या आप किसी और चीज से आदेश देना चाहिए। मुझे लगता है कि यह एक गणना या शामिल क्षेत्र है, और आप उन लोगों द्वारा भी Django डेटाबेस मॉडल के साथ सॉर्ट कर सकते हैं। – Blixt

+0

सिर्फ एक विचार था ... चूंकि जेनेरिक व्यू कुछ प्रकार के फ़िल्टरिंग करना चाहता है, तो मैं टेम्पलेट टैग के साथ सॉर्टिंग क्यों नहीं करता? – Jiaaro

70

ठीक है ... इस पोस्ट अब पुराना है, लेकिन क्या तुम कर सकते हो सभी की ids मिलता है आपकी सूची में ऑब्जेक्ट्स, फिर model.objects.filter(pk__in=list_of_ids)

+1

यह बड़े संग्रहों के लिए बहुत धीमा है, लेकिन सीमित स्थिति में मूल्यवान था जिसमें मुझे समस्या को हल करने के लिए इसकी आवश्यकता थी। यह आपको वस्तुओं की सूचियों पर QuerySet विधियों का उपयोग करने की अनुमति देता है, जो संक्षिप्त कोड के लिए अच्छा हो सकता है। –

+17

इसका नकारात्मक पक्ष यह है कि यह मूल ऑर्डरिंग – yprez

+1

नहीं रखेगा यह एक त्वरित प्रोटोटाइप के लिए अच्छा काम करता है, लेकिन मैं निश्चित रूप से @Blixt निर्दिष्ट कारणों से उत्पादन में ऐसा करने की अनुशंसा नहीं करता हूं। – kqr

संबंधित मुद्दे