पिछले रिकॉर्ड को एक क्वेरी में प्राप्त करें


89

मैं एक निश्चित क्वेरी में अंतिम रिकॉर्ड कैसे प्राप्त कर सकता हूं?

जवाबों:


81

EDIT: अब आपको उपयोग करना है Entry.objects.latest('pub_date')


आप बस इस तरह से कुछ का उपयोग कर सकते हैं reverse():

queryset.reverse()[0]

इसके अलावा, Django प्रलेखन से इस चेतावनी से सावधान रहें:

... ध्यान दें कि reverse()आम तौर पर केवल एक क्वेरीसेट पर बुलाया जाना चाहिए जिसमें एक परिभाषित आदेश होता है (उदाहरण के लिए, जब एक मॉडल के खिलाफ क्वेरी जो एक डिफ़ॉल्ट आदेश को परिभाषित करता है, या उपयोग करते समय order_by())। यदि किसी ऑर्डर के लिए ऐसा कोई ऑर्डर परिभाषित नहीं किया गया है QuerySet, तो reverse()उस पर कॉल करने का कोई वास्तविक प्रभाव नहीं है (कॉल करने से पहले ऑर्डर अपरिभाषित था reverse(), और बाद में अपरिभाषित रहेगा)।


2
जैसा कि django डॉक्स में कहा गया है: "ध्यान दें कि रिवर्स () को आमतौर पर केवल एक क्वेरीसैट पर बुलाया जाना चाहिए जिसमें एक परिभाषित ऑर्डरिंग है (उदाहरण के लिए, जब एक मॉडल के खिलाफ क्वेरी जो एक डिफ़ॉल्ट ऑर्डर को परिभाषित करता है, या ऑर्डर_बाय () का उपयोग करते समय)। इस तरह के आदेश को किसी दिए गए क्वेरीसेट के लिए परिभाषित किया गया है, इस पर रिवर्स कॉलिंग () का कोई वास्तविक प्रभाव नहीं है (रिवर्स कॉल करने से पहले ऑर्डर अपरिभाषित था), और बाद में अपरिभाषित रहेगा। "
जूजुल

6
2017 और स्वीकृत उत्तर अब पुराने हैं। जैसा कि नीचे दिखाया गया है आपको queryset.last () का उपयोग करना चाहिए।
wobbily_col

134

Django डॉक्टर :

latest(field_name=None) दिनांक, फ़ील्ड के रूप में प्रदान की गई field_name का उपयोग करके तालिका में नवीनतम वस्तु लौटाता है।

यह उदाहरण pub_dateफ़ील्ड के अनुसार तालिका में नवीनतम प्रविष्टि लौटाता है :

Entry.objects.latest('pub_date')

5
यह इसे करने का सबसे साफ तरीका है। इसके अलावा, "यदि आपके मॉडल का मेटा get_latest_by को निर्दिष्ट करता है, तो आप डॉक्स के अनुसार field_name तर्क को नवीनतम ()" पर छोड़ सकते हैं।
फ्रेड्रिक मोलरस्ट्रैंड

50

इसे करने का सबसे सरल तरीका है:

books.objects.all().last()

आप भी इसका उपयोग पहली प्रविष्टि को पाने के लिए करते हैं:

books.objects.all().first()

16
books.objects.last() और books.objects.first()चाल चलनी चाहिए।
चंदन

यह एक साथ स्वीकृत उत्तर होना चाहिए XYZ.objects.first()और XYZ.objects.last()
slajma

मुझे लगता है कि अरनौद पी का रास्ता अधिक उपयुक्त है। यह गलत नहीं है तो डीबी में उन सभी वस्तुओं को अनपैक कर देंगे जहां बाद में डीबी क्वेरी का उपयोग करके अंतिम खींच लिया जाता है।
दोपहर

33

Django> = 1.6

जोड़ा गया क्वेरीसैट तरीके पहले () और अंतिम () वे सुविधा तरीके हैं जो फ़िल्टर से मेल खाते हुए पहले या अंतिम ऑब्जेक्ट को लौटाते हैं। यदि कोई वस्तु मेल नहीं खाती तो कोई भी नहीं लौटाता।


32

पहली वस्तु प्राप्त करने के लिए:

ModelName.objects.first()

अंतिम वस्तु प्राप्त करने के लिए:

ModelName.objects.last()

आप फ़िल्टर का उपयोग कर सकते हैं

ModelName.objects.filter(name='simple').first()

यह मेरे लिए काम करता है।


6

जब क्वेरीसेट पहले से ही समाप्त हो जाता है, तो आप ऐसा करने के लिए एक और डीबी संकेत से बचने के लिए कर सकते हैं -

last = queryset[len(queryset) - 1] if queryset else None

उपयोग न करें try...except...
Django IndexErrorइस मामले में फेंक नहीं है ।
यह फेंकता है ( AssertionErrorया ProgrammingErrorजब आप -O विकल्प के साथ अजगर चलाते हैं)


1
यह मानते हुए कि आपका क्वेरीसेट पहले से ही ऑर्डर किया गया है, यह "शीर्ष उत्तर" होना चाहिए, क्योंकि यह एकमात्र समाधान है जो डेटाबेस को फिर से हिट नहीं करता है।
डेविड डी।

4

अगर django 1.6 और उससे अधिक का उपयोग कर रही है, तो नए एपीआई के रूप में इसकी शुरुआत अब बहुत आसान है -

Model.object.earliest()

यह रिवर्स दिशा के साथ नवीनतम () देगा।

ps - मुझे इसका पुराना प्रश्न पता है, मैं पोस्ट कर रहा हूँ जैसे कि इस प्रश्न पर कोई व्यक्ति आगे बढ़ता है, वे इस नई सुविधा को जानते हैं और पुरानी पद्धति का उपयोग करते हुए समाप्त नहीं होते हैं।


3
डॉक्स से: जल्द से जल्द () और नवीनतम () को या तो एक field_name पैरामीटर की आवश्यकता होती है या मॉडल में 'get_latest_by'
panchicore

1

आप उपयोग कर सकते हैं Model.objects.last()या Model.objects.first()। यदि कोई orderingपरिभाषित नहीं है, तो प्राथमिक कुंजी के आधार पर क्वेरीसेट का आदेश दिया जाता है। यदि आप व्यवहार क्वेरी को क्रमबद्ध करना चाहते हैं तो आप अंतिम दो बिंदुओं को संदर्भित कर सकते हैं।

यदि आप ऐसा करने के लिए सोच रहे हैं, तो Model.objects.all().last()पिछले Model.objects.all().first()को पुनः प्राप्त करने के लिए और पहले तत्व को एक क्वेरी में या filtersदूसरे विचार के बिना उपयोग करने के लिए पुनः प्राप्त करें । फिर नीचे कुछ कैविटीज़ देखें।

यहां ध्यान देने योग्य महत्वपूर्ण बात यह है कि यदि आपने orderingअपने मॉडल में किसी को भी शामिल नहीं किया है तो डेटा किसी भी क्रम में हो सकता है और आपके पास एक यादृच्छिक अंतिम या पहला तत्व होगा जो अपेक्षित नहीं था।

उदाहरण के लिए। मान लें कि आपके पास एक मॉडल है जिसका नाम Model12 कॉलम है idऔर item_count10 पंक्तियों में आईडी 1 से 10. है [कोई क्रम निर्धारित नहीं है]

यदि आप Model.objects.all () लास्ट () को इस तरह लाते हैं, तो आप 10 तत्वों की सूची से कोई भी तत्व प्राप्त कर सकते हैं। हां, यह यादृच्छिक है क्योंकि कोई डिफ़ॉल्ट ऑर्डर नहीं है।

तो क्या कर सकते हैं?

  1. आप orderingअपने मॉडल पर किसी भी क्षेत्र या क्षेत्र के आधार पर परिभाषित कर सकते हैं । इसमें प्रदर्शन के मुद्दे भी हैं, कृपया इसे भी देखें। Ref: यहाँ
  2. या आप order_byलाते समय उपयोग कर सकते हैं । इस कदर:Model.objects.order_by('item_count').last()

-5

वर्तमान ऑर्डर के बारे में चिंता किए बिना सबसे सरल तरीका, क्वेरीसैट को एक सूची में बदलना है ताकि आप पायथन के सामान्य नकारात्मक अनुक्रमण का उपयोग कर सकें। इस तरह:

list(User.objects.all())[-1]

2
यह DB से सभी वस्तुओं को क्वेरी करेगा और फिर पहले एक
वार्वारुक

अच्छी बात! जाहिर है कि एक के माध्यम से नहीं लगता था। .Reverse () उत्तर (वर्तमान में चयनित) जाने का सही तरीका है!
जोश अवरमैन ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.