Django

2009-09-07 5 views
104

में खाली क्वेरीसेट के लिए जांच कर रहा है यह जांचने के लिए अनुशंसित मुहावरे क्या है कि कोई प्रश्न किसी परिणाम को लौटाता है या नहीं?
उदाहरण:Django

orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc') 
# If any results 
    # Do this with the results without querying again. 
# Else, do something else... 

मुझे लगता है कि इस जाँच के कई अलग अलग तरीके हैं, लेकिन मुझे पता है कि कैसे एक अनुभवी Django उपयोगकर्ता यह करना होगा चाहते हैं। डॉक्स में अधिकांश उदाहरण सिर्फ इस मामले में जहां कुछ भी नहीं मिला था उपेक्षा ...

उत्तर

101
if not orgs: 
    # Do this... 
else: 
    # Do that... 
+3

यह प्रलेखन में भी वरीयता दी जाती है, उदाहरण के लिए: https: // docs।djangoproject.com/en/1.8/topics/http/shortcuts/#id7 – Wtower

+0

@Wtower आपके द्वारा संदर्भित कोड 404 बढ़ाने के लिए अनुबंध के लिए है यदि फ़िल्टरिंग अभिव्यक्ति किसी भी रिकॉर्ड को हिट नहीं करती है या परिणाम की 'सूची' उत्पन्न करती है रिकॉर्ड हैं। कोड केवल एक बार डेटाबेस हिट करेगा। यदि वे पहले से जांचने के लिए 'मौजूद()' या 'गिनती()' का उपयोग करते हैं, तो रिकॉर्ड रिकॉर्ड होने जा रहे हैं या नहीं, वे डेटाबेस को दो बार मार देंगे (एक बार चेक करने के लिए, रिकॉर्ड प्राप्त करने के बाद)। यह एक विशिष्ट स्थिति है। यह * सामान्य मामला * में शामिल नहीं है, यह जानने के लिए पसंदीदा तरीका है कि कोई क्वेरी रिकॉर्ड लौटाएगी या नहीं, अगर क्वेरीसेट: ... ' – Louis

+1

@Louis जो कोड मैं संदर्भित करता हूं वह केवल एक उदाहरण है जिसमें इसमें शामिल है एक पंक्ति 'अगर my_objects नहीं है:' यह प्रदर्शित करने के लिए कि यह दस्तावेज़ों में यह कैसे करता है। बाकी सब कुछ अप्रासंगिक है इसलिए मुझे आपकी बात नहीं मिलती है। वे एक हजार प्रश्न भी बना सकते हैं और यह अभी भी पूरी तरह से अप्रासंगिक होगा क्योंकि यह इस उत्तर का मुद्दा नहीं है, जिसके साथ मैं स्पष्ट करता हूं कि मैं सहमत हूं। – Wtower

3

लिए सबसे कारगर तरीका (पहले Django 1.2) यह है:

if orgs.count() == 0: 
    # no results 
else: 
    # alrigh! let's continue... 
+3

.exists() अधिक कुशल – dzida

+3

लगता है कि छोड़कर .exists() को मेरी टिप्पणी के कुछ महीने बाद जोड़ा गया था, और Django 1.2 (जो कि एपीआई शामिल है) ~ 8 महीने बाद जारी किया गया था। लेकिन नीचे मतदान के लिए धन्यवाद और तथ्यों की जांच करने के लिए परेशान नहीं। – Bartosz

+4

क्षमा करें, मैंने इसे अधिक सटीक बनाने और सकारात्मक रूप से मतदान करने के लिए आपके उत्तर में छोटे संपादन को जोड़ा। – dzida

14

आप की एक बड़ी संख्या है, तो वस्तुओं, इस (कई बार) बहुत तेजी से हो सकता है:

try: 
    orgs[0] 
    # If you get here, it exists... 
except IndexError: 
    # Doesn't exist! 

एक परियोजना मैं एक विशाल डाटाबेस के साथ पर काम कर रहा हूँ पर, not orgs 400 एमएस है और orgs.count() 25 है 0ms। मेरे सबसे आम उपयोग मामलों में (जहां परिणाम हैं), यह तकनीक अक्सर 20ms से कम हो जाती है। (मुझे मिला एक मामला, यह 6. था।)

निश्चित रूप से, परिणाम के परिणाम को देखने के लिए कितना दूर है, इस पर निर्भर करता है। या यहां तक ​​कि तेज़, अगर यह जल्दी से पाता है; YMMV।

संपादित करें: यह अक्सर orgs.count() से धीमा हो सकता है यदि परिणाम नहीं मिला है, खासकर यदि आप जिस स्थिति को फ़िल्टर कर रहे हैं वह दुर्लभ है; नतीजतन, यह उन कार्यों को देखने में विशेष रूप से उपयोगी है जहां आपको यह सुनिश्चित करने की आवश्यकता है कि दृश्य मौजूद है या Http404 फेंक दें। (जहां, कोई उम्मीद करेगा, लोग उन यूआरएल के लिए पूछ रहे हैं जो अधिक से अधिक मौजूद नहीं हैं।)

134

संस्करण 1.2 के बाद, Django में QuerySet है। exists() विधि है जो सबसे कारगर है:

if orgs.exists(): 
    # Do this... 
else: 
    # Do that... 

लेकिन अगर आप क्वेरीसमूह मूल्यांकन करने के लिए जा रहे हैं फिर भी इसका उपयोग करने के लिए बेहतर है:

if orgs: 
    ... 

अधिक जानकारी read QuerySet.exists() documentation लिए।

5

मैं विधेय

if not orgs: 

से असहमत यह होना चाहिए

if not orgs.count(): 

मैं एक काफी बड़े परिणाम सेट (~ 150k परिणाम) के साथ एक ही मुद्दा रहा था। ऑपरेटर को क्वेरीसेट में ओवरलोड नहीं किया गया है, इसलिए परिणाम वास्तव में चेक किए जाने से पहले सूची के रूप में अनपॅक किया जाता है। मेरे मामले में निष्पादन समय तीन आदेशों से नीचे चला गया।

+4

_ \ _ nonzero _ \ _ पहले से ही QuerySet में अधिभारित है। यदि परिणाम कैश नहीं किया गया है (यह कभी भी क्वेरीसेट के पहले उपयोग पर नहीं है) _ \ _ nonzero _ \ _ का व्यवहार क्वेरीसेट में सभी तत्वों को फिर से चालू करना है। यदि सेट बड़ा है तो यह बहुत बुरा है। – hedleyroos

9

एक क्वेरीसमूह के खालीपन की जाँच करने के लिए:

if orgs.exists(): 
    # Do something 

या आप एक क्वेरीसमूह में पहले आइटम के लिए जाँच कर सकते हैं अगर यह मौजूद नहीं है यह None वापस आ जाएगी:

if orgs.first(): 
    # Do something 
+1

'if orgs.exists()' को एक [उत्तर] (http://stackoverflow.com/a/2373793/1906307) द्वारा कवर किया गया था जो इस से लगभग 5 साल पहले प्रदान किया गया था। एकमात्र चीज यह जवाब तालिका में लाती है जो * शायद * नया है अगर ifgs.first() '। (यहां तक ​​कि यह बहस योग्य है: क्या यह लगभग 5 साल पहले 'orgs [0] '[सुझाए गए] (http://stackoverflow.com/a/2098092/1906307) करने से भी काफी अलग है?) आपको उस हिस्से को विकसित करना चाहिए उत्तर का: जब कोई ऐसा करना चाहता है ** ** ** प्रस्तावित अन्य समाधानों के बजाय? – Louis