2010-12-04 11 views
32

जब भी मैं ऐसा करते हैं:Django की वस्तुओं को संभालने का सबसे अच्छा तरीका क्या है .get?

thepost = Content.objects.get(name="test") 

यह हमेशा एक त्रुटि फेंकता है जब कुछ भी नहीं पाया जाता है। मैं इसे कैसे संभाल सकता हूं?

+0

यह भी देखें [QuerySet.get] (http://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.QuerySet.get) –

+2

इस तरह से यह माना जाता है काम। आपका सवाल क्या हैं? 'Try' कथन कैसे लिखें? –

उत्तर

56
from django.core.exceptions import ObjectDoesNotExist 

try: 
    thepost = Content.objects.get(name="test") 
except ObjectDoesNotExist: 
    thepost = None 

मैं इसे स्मृति से लिख रहा हूं, इसलिए मुझे अपवाद के बारे में निश्चित नहीं है।

+8

इस मामले में, अपवाद 'Content.DoesNotExist' है, और यह कोड संरचना उपयोगी है यदि आप जारी रखना चाहते हैं भले ही ऑब्जेक्ट नहीं मिल पा रहा हो (यानी मेरे उदाहरण में 404 त्रुटि नहीं फेंक दें)। –

20

अक्सर, इसे और अधिक Django शॉर्टकट समारोह get_object_or_404 के बजाय सीधे एपीआई का उपयोग करने के लिए उपयोगी है: काफी स्पष्ट रूप से

from django.shortcuts import get_object_or_404 

thepost = get_object_or_404(Content, name='test') 

, यह एक 404 त्रुटि फेंक देंगे अगर वस्तु नहीं पाया जा सकता है, और अपने कोड होगा जारी रखें अगर यह सफल है।

7

पकड़ने अपवाद

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 
+0

प्राप्त होने पर खाली क्विकसेट आवंटित क्यों करें() बस अपवाद उठाएगा? कोशिश/पकड़ पहला दृष्टिकोण कहीं बेहतर है – ppetrid

+0

आम तौर पर, सामान्य 'वर्कफ़्लो' के लिए अपवादों का उपयोग करना एक अच्छा अभ्यास नहीं है। इस उदाहरण में यह समझना काफी आसान है, लेकिन यदि आप किसी एप्लिकेशन को नियंत्रित करने के लिए अपवादों का उपयोग करना शुरू करते हैं, तो इसे बनाए रखने/डीबग करना मुश्किल होगा। – mrmuggles

+0

@mrmuggles मैं असहमत हूं, अपवाद आपके कोड को व्यवस्थित करने का एक बहुत अच्छा तरीका हो सकता है, e..g 'प्लगइन में प्लगइन के लिए; प्रयत्न; processed_text = plugin.process (टेक्स्ट); अपवाद 1 को छोड़कर, कुछ अपवाद 2 करें; कुछ करें 'इसके लिए कोई आसान विकल्प नहीं है, और इस विशिष्ट मामले में यह बिल्कुल सही समझ में आता है, क्या आप आइटम तक पहुंचने से पहले dict.hkey को डोड करेंगे या बस आइटम तक पहुंचेंगे और KeyError पकड़ लेंगे? –

12

तुम भी एक सामान्य 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." 
0

में के रूप में डॉक्स प्रति एक 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}) 
+1

यह केवल तभी काम करता है जब पोल ऑब्जेक्ट पूरे का प्रतिनिधित्व करता है राय। यदि आप किसी ऑब्जेक्ट के लिए क्वेरी करने का प्रयास कर रहे हैं जो किसी पृष्ठ के मध्य में उतरेगा, तो आप पूरे दृश्य के लिए 404 वापस नहीं करना चाहते हैं। – shacker

2

हैंडलिंग अपवाद वास्तव में एक कस्टम मॉडल प्रबंधक को परिभाषित करने, में के बारे में 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 
5

लेखन का एक अन्य तरीका:

try: 
    thepost = Content.objects.get(name="test") 
except Content.DoesNotExist: 
    thepost = None 

बस है:

thepost = Content.objects.filter(name="test").first() 

ध्यान दें कि दो कड़ाई से वही नहीं हैं। प्रबंधक विधि get मामले मामले में केवल एक अपवाद नहीं उठाएगा, कोई रिकॉर्ड नहीं है जिसके लिए आप पूछ रहे हैं लेकिन एकाधिक रिकॉर्ड पाए जाते हैं। first का उपयोग करते हुए जब एक से अधिक रिकॉर्ड होते हैं तो पहले रिकॉर्ड को लौटकर चुपचाप आपके व्यावसायिक तर्क को विफल कर सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे