python - Django Delete all but last five of queryset -
मेरे पास एक सुपर सरल डीजेन्गो मॉडल है:
वर्ग अधिसूचना (मॉडल.मॉडेल) : Message = models.TextField () user = models.ForeignKey (उपयोगकर्ता) टाइमस्टैंप = मॉडल.डेटाइमफिल्ड (डिफ़ॉल्ट = datetime.datetime.now)
AJAX का उपयोग करना, मैं हर नए संदेशों की जांच करता हूं मिनट। मैं किसी भी समय उपयोगकर्ता के लिए पांच सबसे हाल की सूचनाएं दिखाता हूं। मैं क्या बचने का प्रयास कर रहा हूं, यह परिदृश्य है।
उपयोगकर्ता लॉग इन करता है और इसमें कोई सूचना नहीं है जब उपयोगकर्ता की विंडो ऊपर है, तो उसे 10 नए संदेश प्राप्त होते हैं। चूंकि मैं केवल उसे पांच दिखा रहा हूँ, कोई बड़ी बात नहीं है समस्या तब होती है जब उपयोगकर्ता उसकी नोटिफिकेशन को हटाना शुरू कर देता है अगर वह प्रदर्शित होने वाले पांच को हटा देता है, तो पांच पुराने लोगों को अगले एजेक्स कॉल या रीफ्रेश पर प्रदर्शित किया जाएगा।
मैं अपने मॉडल की सहेजने की पद्धति को सब कुछ हटाना चाहूंगा, लेकिन 5 सबसे हाल की वस्तुओं को हटा दिया जाएगा एक नया बचा है दुर्भाग्य से, आप ऐसा करने के लिए [5:] का उपयोग नहीं कर सकते।
संपादित करें
मैंने ऐसा करने की कोशिश की जो उम्मीद के मुताबिक काम नहीं करती (मॉडल की सहेजने की विधि में):
< कोड> नोट्स = नोटिफिकेशन.ओबैजेसफ़ाइलटर (यूजर = सेल्फ। यूजर) [: 4] अधिसूचना.ओबैजेस.एक्सएक्वायई (पीके_इन = नोट्स) .delete ()
मुझे नहीं मिल सका अजीब व्यवहार में एक पैटर्न, लेकिन परीक्षण के कुछ समय बाद, यह केवल एक सबसे हाल ही में एक हटा दिया जाएगा जब एक नया बनाया गया था। मेरे पास कोई विचार नहीं है कि यह क्यों होगा। मॉडल का मेटा वर्ग (टाइमस्टैम्प अवरोही करके) के क्रम का ध्यान रखा जाता है मदद के लिए धन्यवाद, लेकिन मेरा तरीका केवल एक ही काम करता है जो लगातार काम करता है।
यह एक है थोड़ा बूढ़ा है, लेकिन मेरा मानना है कि आप निम्न कार्य कर सकते हैं:
नोट्स = नोटिफिकेशन.ओबैजेस .फिल्टर (यूजर = सेल्फ। यूजर) [: 4] अधिसूचना.ओबैजेस.एक्सआइक्वाय (पीके__इन = लिस्ट नोट्स))। Delete () # list () एक डेटाबेस हिट बलों
इसे दो हिट्स की लागत होती है, लेकिन लेन-देन मिडलवेयर के साथ लूप का उपयोग करने से बचा जाता है।
इसका कारण यह है कि Django एक ही क्वेरी बनाता है और, MySQL 5.1 में, यह उठाता है त्रुटि
(1235, "MySQL का यह संस्करण अभी तक 'सीमा और amp; IN / ALL / any / some subquery' 'का समर्थन नहीं करता है)"
सूची (नोट्स)
का उपयोग करके, हम नोट्स
की एक क्वेरी को बाध्य करते हैं, इस से बचने के लिए। यह आगे के लिए अनुकूलित किया जा सकता है:
नोट्स = नोटिफिकेशन.ओबैजेस। फ़िलटर (उपयोगकर्ता = स्व.युसर) [: 4] .values_list ("id", flat = true) # केवल आईडी पुनर्प्राप्त करें । Notification.objects.exclude (pk__in = सूची (नोट्स))। Delete ()
Comments
Post a Comment