मैं एक निश्चित क्वेरी में अंतिम रिकॉर्ड कैसे प्राप्त कर सकता हूं?
जवाबों:
EDIT: अब आपको उपयोग करना है Entry.objects.latest('pub_date')
आप बस इस तरह से कुछ का उपयोग कर सकते हैं reverse()
:
queryset.reverse()[0]
इसके अलावा, Django प्रलेखन से इस चेतावनी से सावधान रहें:
... ध्यान दें कि
reverse()
आम तौर पर केवल एक क्वेरीसेट पर बुलाया जाना चाहिए जिसमें एक परिभाषित आदेश होता है (उदाहरण के लिए, जब एक मॉडल के खिलाफ क्वेरी जो एक डिफ़ॉल्ट आदेश को परिभाषित करता है, या उपयोग करते समयorder_by()
)। यदि किसी ऑर्डर के लिए ऐसा कोई ऑर्डर परिभाषित नहीं किया गया हैQuerySet
, तोreverse()
उस पर कॉल करने का कोई वास्तविक प्रभाव नहीं है (कॉल करने से पहले ऑर्डर अपरिभाषित थाreverse()
, और बाद में अपरिभाषित रहेगा)।
latest(field_name=None)
दिनांक, फ़ील्ड के रूप में प्रदान की गई field_name का उपयोग करके तालिका में नवीनतम वस्तु लौटाता है।यह उदाहरण
pub_date
फ़ील्ड के अनुसार तालिका में नवीनतम प्रविष्टि लौटाता है :
Entry.objects.latest('pub_date')
इसे करने का सबसे सरल तरीका है:
books.objects.all().last()
आप भी इसका उपयोग पहली प्रविष्टि को पाने के लिए करते हैं:
books.objects.all().first()
books.objects.last()
और books.objects.first()
चाल चलनी चाहिए।
XYZ.objects.first()
और XYZ.objects.last()
Django> = 1.6
जोड़ा गया क्वेरीसैट तरीके पहले () और अंतिम () वे सुविधा तरीके हैं जो फ़िल्टर से मेल खाते हुए पहले या अंतिम ऑब्जेक्ट को लौटाते हैं। यदि कोई वस्तु मेल नहीं खाती तो कोई भी नहीं लौटाता।
जब क्वेरीसेट पहले से ही समाप्त हो जाता है, तो आप ऐसा करने के लिए एक और डीबी संकेत से बचने के लिए कर सकते हैं -
last = queryset[len(queryset) - 1] if queryset else None
उपयोग न करें try...except...
।
Django IndexError
इस मामले में फेंक नहीं है ।
यह फेंकता है ( AssertionError
या ProgrammingError
जब आप -O विकल्प के साथ अजगर चलाते हैं)
अगर django 1.6 और उससे अधिक का उपयोग कर रही है, तो नए एपीआई के रूप में इसकी शुरुआत अब बहुत आसान है -
Model.object.earliest()
यह रिवर्स दिशा के साथ नवीनतम () देगा।
ps - मुझे इसका पुराना प्रश्न पता है, मैं पोस्ट कर रहा हूँ जैसे कि इस प्रश्न पर कोई व्यक्ति आगे बढ़ता है, वे इस नई सुविधा को जानते हैं और पुरानी पद्धति का उपयोग करते हुए समाप्त नहीं होते हैं।
आप उपयोग कर सकते हैं Model.objects.last()
या Model.objects.first()
। यदि कोई ordering
परिभाषित नहीं है, तो प्राथमिक कुंजी के आधार पर क्वेरीसेट का आदेश दिया जाता है। यदि आप व्यवहार क्वेरी को क्रमबद्ध करना चाहते हैं तो आप अंतिम दो बिंदुओं को संदर्भित कर सकते हैं।
यदि आप ऐसा करने के लिए सोच रहे हैं, तो Model.objects.all().last()
पिछले Model.objects.all().first()
को पुनः प्राप्त करने के लिए और पहले तत्व को एक क्वेरी में या filters
दूसरे विचार के बिना उपयोग करने के लिए पुनः प्राप्त करें । फिर नीचे कुछ कैविटीज़ देखें।
यहां ध्यान देने योग्य महत्वपूर्ण बात यह है कि यदि आपने ordering
अपने मॉडल में किसी को भी शामिल नहीं किया है तो डेटा किसी भी क्रम में हो सकता है और आपके पास एक यादृच्छिक अंतिम या पहला तत्व होगा जो अपेक्षित नहीं था।
उदाहरण के लिए। मान लें कि आपके पास एक मॉडल है जिसका नाम Model1
2 कॉलम है id
और item_count
10 पंक्तियों में आईडी 1 से 10. है [कोई क्रम निर्धारित नहीं है]
यदि आप Model.objects.all () लास्ट () को इस तरह लाते हैं, तो आप 10 तत्वों की सूची से कोई भी तत्व प्राप्त कर सकते हैं। हां, यह यादृच्छिक है क्योंकि कोई डिफ़ॉल्ट ऑर्डर नहीं है।
तो क्या कर सकते हैं?
ordering
अपने मॉडल पर किसी भी क्षेत्र या क्षेत्र के आधार पर परिभाषित कर सकते हैं । इसमें प्रदर्शन के मुद्दे भी हैं, कृपया इसे भी देखें। Ref: यहाँorder_by
लाते समय उपयोग कर सकते हैं । इस कदर:Model.objects.order_by('item_count').last()
वर्तमान ऑर्डर के बारे में चिंता किए बिना सबसे सरल तरीका, क्वेरीसैट को एक सूची में बदलना है ताकि आप पायथन के सामान्य नकारात्मक अनुक्रमण का उपयोग कर सकें। इस तरह:
list(User.objects.all())[-1]