यदि कोई वस्तु 404 को वापस किए बिना django के दृश्य में मौजूद है, तो उसे सत्यापित करने का सही तरीका क्या है?


91

मुझे यह सत्यापित करने की आवश्यकता है कि यदि कोई वस्तु मौजूद है और वस्तु वापस आती है, तो उस प्रदर्शन के आधार पर। 404 लौटाए बिना इसे करने का सही तरीका क्या है?

try:
    listing = RealEstateListing.objects.get(slug_url = slug)
except:
    listing = None

if listing:

रसील, क्या मैं सुझाव दे सकता हूं कि आप दूसरे उत्तर को स्वीकार करने पर विचार करें? यह ऐसा करने का सही तरीका प्रतीत होता है, और स्वीकृत उत्तर की तुलना में काफी अधिक उत्कीर्ण किया गया है।
अज़ेंडेल

1
मैं इस पर विचार कर सकता हूं, हालांकि मौजूद था Django 1.2 में पेश किया गया था जो 17 मई 2010 को जारी किया गया था, यदि आप ध्यान दें कि मेरा प्रश्न 09 में प्रस्तुत किया गया था ... यह उस समय सही उत्तर था। यदि एक्ज़िस्ट () को अब इसे करने का सबसे अच्छा तरीका माना जाता है, तो मुझे लगता है कि यह दूसरा उत्तर चुनने के लिए शब्दार्थ से सही होगा, है ना?
रासिएल

Rasiel, यह समझ में आता है कि उस समय सही जवाब था। लेकिन स्टैकेओवरफ्लो साइटें सबसे अच्छे उत्तरों के साथ अच्छे / आधिकारिक प्रश्नों के सेट के निर्माण के बारे में अधिक प्रतीत होती हैं क्योंकि साइटें लोगों की समस्याओं का समाधान ढूंढ रही हैं। इसलिए अब "आधिकारिक तौर पर सही" उत्तर का चयन करने के लिए मेरा सुझाव।
एजेंडेल

if listing:होना चाहिए else:
क्रोनिकल

जवाबों:


116

यदि आपको 404 नहीं दिया गया है तो मैं 404 रैपर का उपयोग नहीं करूंगा। यह इरादे का दुरुपयोग है। इसके बजाय, केवल DoNotExist को पकड़ें।

try:
    listing = RealEstateListing.objects.get(slug_url=slug)
except RealEstateListing.DoesNotExist:
    listing = None

+1: हाँ, यह स्वीकार किए जाते हैं की तुलना में बेहतर समाधान है, यदि आप 404 नहीं चाहते हैं।
कार्ल मेयर

हाँ, यह बेहतर समाधान प्रतीत होता है
रासिएल

3
exists()यदि आप ऑब्जेक्ट के साथ कुछ करना चाहते हैं तो यह समाधान बेहतर काम करता है ।
SaeX

2
मुझे जोड़ना पसंद है values_list('id', flat=True)। अगर मुझे यह देखना है कि क्या मौजूद हैlisting = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
erajuan

इस वाक्यविन्यास के बारे में मुझे जो कुछ अजीब लगा वह RealEstateListing.DoesNotExistयह है कि मॉडल का जिक्र है, न कि वस्तु का। ऐसा क्यों नहीं है RealEstateListing.objects.get(slug_url=slug).DoesNotExist?
मैक्सिम वैली

198

आप भी कर सकते हैं:

if not RealEstateListing.objects.filter(slug_url=slug).exists():
    # do stuff...

कभी-कभी try: except:ब्लॉक का उपयोग करना अधिक स्पष्ट होता है और अन्य बार वन-लाइनर exists()कोड को स्पष्ट दिखता है ... यह सब आपके आवेदन तर्क पर निर्भर करता है।



7
यह बेहतर तरीका है और इसका उत्तर होना चाहिए
झारवुड

3
मैं मान रहा हूँ कि सही के exists()साथ काम नहीं करता है get()?
एडुआर्ड लुका

8
ध्यान दें कि यह समाधान केवल मान्य है यदि आप प्रश्न में ऑब्जेक्ट का उपयोग नहीं करने जा रहे हैं। अन्यथा (ओपी स्थिति की तरह) यह गलत है और स्वीकृत समाधान की तुलना में बहुत धीमा है: यदि आप get()बाद में करते हैं, तो यह डेटाबेस को दूसरी क्वेरी भेज देगा।
क्रोनिकल

1
यदि आप वस्तु के साथ कुछ करने के लिए अस्तित्व की जाँच कर रहे हैं (यदि यह मौजूद है), तो मैं try-exceptअधिक पसंद करूंगा exists()
जितिन पावितरन

7
listing = RealEstateListing.objects.filter(slug_url=slug).first() 

2
यह सबसे अच्छा समाधान है यदि आपको बाद में संभावित वस्तु का उपयोग करने की आवश्यकता है, क्योंकि इसके लिए केवल एक असाइनमेंट की आवश्यकता होती है, और यह एक कोशिश / ब्लॉक को छोड़कर उपयोग करने से बचता है। ध्यान दें कि आप बाद में बस अस्तित्व के लिए परीक्षण कर सकते हैंif listing:
माइकल हेस

कोशिश करना / छोड़ना बुरी आदत है। सॉफ़्टवेयर डेवलपमेंट के सबसे महत्वपूर्ण पहलुओं में से एक है एक्सेप्शन को नियंत्रित करने की उपलब्धता, यह एक अच्छा उपयोगकर्ता अनुभव प्रदान करने में सक्षम है। जब कुछ ठीक से काम नहीं कर रहा है तो लोगों को बताएं। दूसरा; यदि आप किसी QuerySet उपयोग .exists () के अस्तित्व का परीक्षण करना चाहते हैं अन्यथा एक वस्तु है। उनके प्राथमिक कुंजी के साथ अस्तित्व के लिए परीक्षण .... अगर object.pk: // रन कोड () यह क्वेरी ऑब्जेक्ट के सभी डेटा को पुनर्प्राप्त करने की तुलना में तेज़ है। आप बस जानना चाहते हैं कि क्या मौजूद है।
वोल्फगैंग लियोन

2
पहले से ही कोशिश / छोड़कर और उपयोग कर एक समाधान था .exists()। मुझे लगता है कि एसओ में बहुत अच्छा विचार है कि कई अलग-अलग उत्तर हैं कि चीजों को कैसे करना है। शायद यह उन लोगों के लिए बेहतर है जो मौजूद होने पर भी वस्तु का उपयोग करना चाहते हैं। मैं कोई भी नियम नहीं बनाऊंगा अगर कोशिश करना / छोड़ना चाहिए या नहीं। कभी-कभी इसका अच्छा, और कभी-कभी यह उदाहरण के लिए बुरा होता है यदि आप बहुत कॉम्पैक्ट कोड बनाना चाहते हैं।
हेनरिक हेनो

0

मैं इसे सरल रूप में निम्नानुसार करूंगा:

listing = RealEstateListing.objects.filter(slug_url=slug)
if listing:
    # do stuff

मुझे कोशिश / पकड़ की कोई आवश्यकता नहीं दिखती। यदि परिणाम में संभावित रूप से कई ऑब्जेक्ट हैं, तो उपयोगकर्ता हेनरिक हेनो द्वारा दिखाए गए अनुसार पहले () का उपयोग करें


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