जब भी मैं ऐसा करते हैं:Django की वस्तुओं को संभालने का सबसे अच्छा तरीका क्या है .get?
thepost = Content.objects.get(name="test")
यह हमेशा एक त्रुटि फेंकता है जब कुछ भी नहीं पाया जाता है। मैं इसे कैसे संभाल सकता हूं?
जब भी मैं ऐसा करते हैं:Django की वस्तुओं को संभालने का सबसे अच्छा तरीका क्या है .get?
thepost = Content.objects.get(name="test")
यह हमेशा एक त्रुटि फेंकता है जब कुछ भी नहीं पाया जाता है। मैं इसे कैसे संभाल सकता हूं?
from django.core.exceptions import ObjectDoesNotExist
try:
thepost = Content.objects.get(name="test")
except ObjectDoesNotExist:
thepost = None
मैं इसे स्मृति से लिख रहा हूं, इसलिए मुझे अपवाद के बारे में निश्चित नहीं है।
इस मामले में, अपवाद 'Content.DoesNotExist' है, और यह कोड संरचना उपयोगी है यदि आप जारी रखना चाहते हैं भले ही ऑब्जेक्ट नहीं मिल पा रहा हो (यानी मेरे उदाहरण में 404 त्रुटि नहीं फेंक दें)। –
अक्सर, इसे और अधिक Django शॉर्टकट समारोह get_object_or_404
के बजाय सीधे एपीआई का उपयोग करने के लिए उपयोगी है: काफी स्पष्ट रूप से
from django.shortcuts import get_object_or_404
thepost = get_object_or_404(Content, name='test')
, यह एक 404 त्रुटि फेंक देंगे अगर वस्तु नहीं पाया जा सकता है, और अपने कोड होगा जारी रखें अगर यह सफल है।
पकड़ने अपवाद
try:
thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
thepost = None
वैकल्पिक रूप से आप फ़िल्टर कर सकते हैं, जो अगर कुछ भी नहीं
posts = Content.objects.filter(name="test")
if posts:
# do something with posts[0] and see if you want to raise error if post > 1
प्राप्त होने पर खाली क्विकसेट आवंटित क्यों करें() बस अपवाद उठाएगा? कोशिश/पकड़ पहला दृष्टिकोण कहीं बेहतर है – ppetrid
आम तौर पर, सामान्य 'वर्कफ़्लो' के लिए अपवादों का उपयोग करना एक अच्छा अभ्यास नहीं है। इस उदाहरण में यह समझना काफी आसान है, लेकिन यदि आप किसी एप्लिकेशन को नियंत्रित करने के लिए अपवादों का उपयोग करना शुरू करते हैं, तो इसे बनाए रखने/डीबग करना मुश्किल होगा। – mrmuggles
@mrmuggles मैं असहमत हूं, अपवाद आपके कोड को व्यवस्थित करने का एक बहुत अच्छा तरीका हो सकता है, e..g 'प्लगइन में प्लगइन के लिए; प्रयत्न; processed_text = plugin.process (टेक्स्ट); अपवाद 1 को छोड़कर, कुछ अपवाद 2 करें; कुछ करें 'इसके लिए कोई आसान विकल्प नहीं है, और इस विशिष्ट मामले में यह बिल्कुल सही समझ में आता है, क्या आप आइटम तक पहुंचने से पहले dict.hkey को डोड करेंगे या बस आइटम तक पहुंचेंगे और KeyError पकड़ लेंगे? –
तुम भी एक सामान्य DoesNotExist पकड़ कर सकते हैं मेल खाता है एक खाली सूची वापस आ जाएगी। http://docs.djangoproject.com/en/dev/ref/models/querysets/
from django.core.exceptions import ObjectDoesNotExist
try:
e = Entry.objects.get(id=3)
b = Blog.objects.get(id=1)
except ObjectDoesNotExist:
print "Either the entry or blog doesn't exist."
में के रूप में डॉक्स प्रति एक Http404 exception स्थापना महान काम करता है:
अपने विचारों में विभिन्न बिंदुओं परfrom django.http import Http404
def detail(request, poll_id):
try:
p = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404
return render_to_response('polls/detail.html', {'poll': p})
यह केवल तभी काम करता है जब पोल ऑब्जेक्ट पूरे का प्रतिनिधित्व करता है राय। यदि आप किसी ऑब्जेक्ट के लिए क्वेरी करने का प्रयास कर रहे हैं जो किसी पृष्ठ के मध्य में उतरेगा, तो आप पूरे दृश्य के लिए 404 वापस नहीं करना चाहते हैं। – shacker
हैंडलिंग अपवाद वास्तव में एक कस्टम मॉडल प्रबंधक को परिभाषित करने, में के बारे में cumbersome..What हो सकता है models.py फ़ाइल,
class ContentManager(model.Manager):
def get_nicely(self, **kwargs):
try:
return self.get(kwargs)
except(KeyError, Content.DoesNotExist):
return None
और उसके बाद की तरह सामग्री मॉडल वर्ग में शामिल
class Content(model.Model):
...
objects = ContentManager()
इस तरह से यह आसानी से विचारों में निपटा जा सकता है लिये यानि
post = Content.objects.get_nicely(pk = 1)
if post != None:
# Do something
else:
# This post doesn't exist
लेखन का एक अन्य तरीका:
try:
thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
thepost = None
बस है:
thepost = Content.objects.filter(name="test").first()
ध्यान दें कि दो कड़ाई से वही नहीं हैं। प्रबंधक विधि get
मामले मामले में केवल एक अपवाद नहीं उठाएगा, कोई रिकॉर्ड नहीं है जिसके लिए आप पूछ रहे हैं लेकिन एकाधिक रिकॉर्ड पाए जाते हैं। first
का उपयोग करते हुए जब एक से अधिक रिकॉर्ड होते हैं तो पहले रिकॉर्ड को लौटकर चुपचाप आपके व्यावसायिक तर्क को विफल कर सकते हैं।
यह भी देखें [QuerySet.get] (http://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.QuerySet.get) –
इस तरह से यह माना जाता है काम। आपका सवाल क्या हैं? 'Try' कथन कैसे लिखें? –