शून्य पंक्तियों को संभालने के दौरान django में फ़िल्टर ()। अद्यतन() को फ़िल्टर करने का कोई अच्छा तरीका है? आइए कहें कि मैं दौड़ना चाहता हूं:

Dogs.objects.filter(noise='woof').update(animal_name='dog')

यह फेंकता है और त्रुटि अगर Dogs.objects.filter(noise='woof') शून्य परिणाम देता है। अब मैं कर सकता हूँ:

dogs = Dogs.objects.filter(noise='woof')
if len(dogs) > 0:
    dogs.update(animal_name='dog')

लेकिन क्या यह थोड़ा गन्दा लगता है, ऐसा करने का कोई बेहतर तरीका? कुछ इस तरह:

Dogs.objects.filter(noise='woof').update_if_rows(animal_name='dog')
1
superdee 7 अगस्त 2018, 08:09
इसे करने का सबसे पाइथोनिक तरीका try/except ब्लॉक का उपयोग करना है।
 – 
lmiguelvargasf
7 अगस्त 2018, 08:30
यह कोई त्रुटि नहीं फेंकेगा, यह केवल पूर्णांक 0 लौटाएगा, जिसका अर्थ है कि 0 पंक्तियाँ अपडेट की गई हैं और यह स्वीकृत व्यवहार है। आपको इसे स्पष्ट रूप से संभालने की ज़रूरत नहीं है।
 – 
Satendra
7 अगस्त 2018, 08:56
यदि आपको कोई त्रुटि या अपवाद मिल रहा है, तो इसे प्रश्न में अपडेट करें, यह कुछ और होना चाहिए
 – 
Satendra
7 अगस्त 2018, 08:57
पूर्ण त्रुटि संदेश/स्टैकट्रेस जोड़ें।
 – 
Ankit Jaiswal
7 अगस्त 2018, 09:26

3 जवाब

मुझे नहीं पता कि आप Dogs.objects.filter().update() के बारे में चिंतित क्यों हैं, यह अपवाद नहीं उठाएगा।

यह एक sql डिबग कोड है यह देखने के लिए कि filter().update() को रॉ sql क्वेरी में कैसे बदला जाता है

import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())    

Dogs.objects.filter(noise='woof').update(animal_name='dog')

यह sql क्वेरी डिबग परिणाम है sql क्वेरी बहुत आसान है!. शून्य पंक्तियों के बारे में चिंता न करें।

UPDATE `app_dogs` SET `animal_name` = 'dog' WHERE `app_dogs`.`noise` = 'woof'

लेकिन अगर आप अभी भी अपवाद हैंडलिंग चाहते हैं

मेरी राय में, एक आसान तरीका, इस तरह अपवाद प्रबंधन का उपयोग करना है।

try:
    Dogs.objects.filter(noise='woof').update(animal_name='dog')
except DoesNotExist as e:
    pass
1
EunChong Lee 7 अगस्त 2018, 10:55
अंतिम उदाहरण में उस कोशिश ब्लॉक में कुछ भी DoesNotExist अपवाद नहीं उठाएगा। वे केवल 'प्राप्त' संचालन के लिए उठाए जाते हैं।
 – 
Shadow
8 अगस्त 2018, 02:11
if dogs.exists():
   dogs.update(animal_name='dog')
0
Kapil Lamichhane 7 अगस्त 2018, 23:31

कोई पंक्ति न होने पर भी अद्यतन कॉल करने में कुछ भी गलत नहीं है।

वास्तव में, पहले जाँच करने के बजाय ऐसा करना अधिक कुशल है क्योंकि आप कम प्रश्न पूछेंगे।

आइए हमारे यहां मौजूद कुछ विकल्पों की तुलना करें;

Dogs.objects.filter(noise="woof").update(animal_name="dog")

यह एक ऐसा प्रश्न करेगा जो ऐसा कुछ दिखता है।

UPDATE dogs SET animal_name = "dog" WHERE noise = "woof";

अब कुछ उत्तरों के सरल उदाहरणों में से एक पर;

dogs = Dogs.objects.filter(noise="woof")
if dogs.exists():
    dogs.update(animal_name='dog')

यह यह देखने के लिए एक प्रश्न करेगा कि क्या कोई कुत्ता मौजूद है, उसके बाद अद्यतन (यदि आवश्यक हो) के बाद।

SELECT 1 FROM dogs WHERE noise = "woof" LIMIT 1;
UPDATE dogs SET animal_name = "dog" WHERE noise = "woof";

ध्यान दें कि अंतिम क्वेरी बिल्कुल वैसी ही है जैसी हमने ऊपर की थी। हमने यहां बिना किसी वास्तविक लाभ के एक अतिरिक्त राउंड ट्रिप की है।


अब, लॉट का सबसे खराब विकल्प।

dogs = Dogs.objects.filter(noise="woof")
if len(dogs):  # or len(dogs) > 0 or even just dogs - they all have the same effect
    dogs.update(animal_name="dog")

यह पूरे परिणाम सेट (यानी, इस तालिका में प्रत्येक जानवर जो 'वूफ' शोर करता है) को Django में लोड करेगा। फिर यह पिछले दो उदाहरणों के अनुसार समान क्वेरी चलाएगा।

SELECT * FROM dog WHERE noise="woof";
UPDATE dogs SET animal_name = "dog" WHERE noise = "woof";

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


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

यदि आपके पास तर्क है जिसके लिए आपको यह जानने की आवश्यकता है कि कुछ भी अपडेट हुआ है या नहीं - इसके बजाय अपडेट से वापसी का उपयोग करें। यह आपको उन पंक्तियों की संख्या देगा जो इस क्वेरी से प्रभावित हुई थीं।

0
Shadow 8 अगस्त 2018, 02:11