2011-08-23 10 views
31

संक्षिप्त प्रश्न
PostgreSQL डेटाबेस से कनेक्ट होने पर Django फ़िल्टर कॉल से लौटाई गई सूची का डिफ़ॉल्ट क्रम क्या है?Django फ़िल्टर कॉल से लौटाई गई सूची का डिफ़ॉल्ट क्रम क्या है?

पृष्ठभूमि
अपने ही प्रवेश करके, मैं आवेदन पर एक गरीब धारणा में परत कि जिस क्रम में एक सूची लौटा दिया जाता है लगातार हो जाएगा कर दिया था, कि 'order_by' का उपयोग कर के बिना है। जिन वस्तुओं की मैं पूछताछ कर रहा था उनकी सूची वर्णमाला क्रम में या किसी अन्य जानबूझकर क्रम में नहीं है। यह उसी क्रम में बने रहने के लिए सोचा गया था, जहां उन्हें डेटाबेस में जोड़ा गया था।

यह धारणा सैकड़ों प्रश्नों के लिए सच रही, लेकिन मेरे आवेदन द्वारा विफलता की सूचना दी गई जब आदेश अनजाने में बदल गया। मेरे ज्ञान के लिए, इस समय के दौरान इनमें से कोई भी रिकॉर्ड छुआ नहीं था क्योंकि मैं अकेला व्यक्ति हूं जो डीबी को बनाए रखता है। भ्रम में जोड़ने के लिए, मैक ओएस एक्स पर Django ऐप चलाने पर, यह अभी भी अपेक्षित के रूप में काम करता है, लेकिन विन XP पर, यह ऑर्डर बदल गया। (ध्यान दें कि सैकड़ों प्रश्न Win XP पर थे)।

इससे कोई अंतर्दृष्टि उपयोगी होगी क्योंकि मुझे Django या PostgreSQL दस्तावेज़ में कुछ भी नहीं मिला जो ऑपरेटिंग सिस्टम में अंतर को समझाता है।

उदाहरण कॉल

required_tests = Card_Test.objects.using(get_database()).filter(name__icontains=key) 

संपादित
के साथ कुछ सहकर्मी के मेरा आज बोलने के बाद, मैं ब्योर्न Lindqvist रूप में एक ही जवाब के साथ आया था।

वापस देखकर, मुझे निश्चित रूप से समझ में आता है कि यह अक्सर गलत क्यों किया जाता है। एक ओआरएम Django, sqlalchemy, या जो भी हो, का उपयोग करने के लाभों में से एक यह है कि आप बिना किसी डेटाबेस को जानने या समझने (विवरण में) के बिना आदेश लिख सकते हैं। माना जाता है कि मैं इन उपयोगकर्ताओं में से एक रहा हूं। हालांकि इसका फ्लिप-साइड यह है कि डेटाबेस को विस्तार से डिबगिंग त्रुटियों के बिना इस तरह की समस्याएं काफी परेशानी और संभावित आपदाजनक हैं।

उत्तर

50

वहाँ कोई डिफ़ॉल्ट आदेश, एक बिंदु पर्याप्त बल दिया नहीं किया जा सकता है कि क्योंकि हर कोई गलत यह करता है।

डेटाबेस में एक तालिका सामान्य HTML तालिका नहीं है, यह टुपल्स का एक असाधारण सेट है। यह अक्सर आश्चर्यचकित प्रोग्रामर केवल MySQL के लिए उपयोग किया जाता है क्योंकि उस विशेष डेटाबेस में पंक्तियों का क्रम अक्सर पूर्वानुमानित होता है क्योंकि इससे कुछ उन्नत अनुकूलन तकनीकों का लाभ नहीं उठाया जाता है।

select * from table limit 10 
select * from table limit 10 offset 10 
select * from table order by x limit 10 

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

आप Django स्तर पर एक डिफ़ॉल्ट आदेश है, यह प्रत्येक गैर-आदेश दिया क्वेरी के लिए खंड द्वारा एक आदेश जोड़ने के लिए कारण बनता है जो जोड़ सकते हैं हालांकि:

class Table(models.Model): 
    ... 
    class Meta: 
     ordering = ['name'] 

नोट यह एक प्रदर्शन खींचें हो सकता है, के लिए अगर कुछ कारण आपको आदेश पंक्तियों की आवश्यकता नहीं है।

+0

अच्छा फर्म वितरण :) – kronosapiens

-1

यदि आप चाहते हैं उन्हें क्रम में वापस आ गए हैं कि वे डाला गया:

created = models.DateTimeField(auto_now_add=True, db_index=True) 
# last_modified = models.DateTimeField(auto_now=True, db_index=True) 

class Meta: 
    ordering = ['created',] 
    # ordering = ['-last_modified'] # sort last modified first 
+0

के बजाय अपने मॉडल को संशोधित करने के लिए एक नया जोड़ने के लिए:

अपने मॉडल के लिए निम्न जोड़ें फ़ील्ड, क्यों न केवल ऑटो-इंक्रिमेंटिंग आईडी द्वारा ऑर्डर करें कि अधिकांश मॉडल हैं? यह परिशुद्धता के मुद्दों के अधीन नहीं है (आपको इस बारे में चिंता करना होगा कि डेटटाइमफ़िल्फ़ कितना दानेदार है) या सिस्टम समय परिवर्तनों से धोखा दिया जा रहा है। – aggieNick02

+0

यह केवल तभी काम करता है यदि आप वास्तव में सुनिश्चित हैं कि आवेषण हमेशा ऑटो-इंक का उपयोग कर रहे हैं। अनुक्रम और अप्रयुक्त आईडी का उपयोग कभी नहीं कर रहे हैं, अन्य डीबी या डंप से डंप जो एक निर्मित समय निर्धारित करते हैं जो प्राथमिक कुंजी के क्रम में दिखाई नहीं देगा। आईडी का उपयोग करने के लिए पारदर्शी नहीं है जब आप वास्तव में तिथि से सॉर्ट करना चाहते हैं - और अक्सर आप वास्तव में last_modified द्वारा क्रमबद्ध करना चाहते हैं - और आईडी उस मामले में सहायता नहीं करेगी। – Risadinha

+0

मैं सहमत हूं कि कुछ कोने-मामले हैं जहां आप कुछ कस्टम करना चाहते हैं, लेकिन डिफ़ॉल्ट रूप से, प्रत्येक मॉडल को स्वत: वृद्धि आईडी मिलती है और कोई अप्रयुक्त आईडी पुन: उपयोग नहीं होता है। इसके अलावा, डेटटाइमफ़िल्ल्ड के साथ, यदि आप दो मॉडल अपने डेटटाइमफ़ील्ड में समान मान के साथ समाप्त होते हैं तो आपको एक समस्या है। यह django संस्करण/डेटाबेस बैकएंड के कारण परिशुद्धता के आधार पर हो सकता है। – aggieNick02

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