जवाबों:
ऐसा करने के लिए कोई 'बिल्ट इन' तरीका नहीं है। Django हर बार DoNotExist अपवाद को बढ़ाएगा। अजगर में इसे संभालने का मुहावरेदार तरीका यह है कि इसे पकड़ने की कोशिश में लपेटें:
try:
go = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
go = None
मैंने क्या किया, safe_get
मॉडल को उप-वर्ग करना है। मानेगर, ऊपर दिए गए कोड की तरह बनाएं और अपने मॉडल के लिए उस प्रबंधक का उपयोग करें। इस तरह आप लिख सकते हैं: SomeModel.objects.safe_get(foo='bar')
।
SomeModel.objects.filter(foo='bar').first()
इस रिटर्न का पहला मैच, या कोई भी उपयोग कर सकते हैं । यह विफल नहीं होता है अगर वहाँ कई उदाहरण हैंqueryset.get()
filter().first()
मुझे लगता है कि अपवाद रास्ता तय करना है।
Django 1.6 के बाद से आप पहले () विधि का उपयोग कर सकते हैं :
Content.objects.filter(name="baby").first()
get()
DoesNotExist
यदि कोई ऑब्जेक्ट दिए गए मापदंडों के लिए नहीं मिला है तो एक अपवाद उठाता है । यह अपवाद भी मॉडल वर्ग का एक गुण है।DoesNotExist
से अपवाद inheritsdjango.core.exceptions.ObjectDoesNotExist
आप अपवाद को पकड़ सकते हैं None
और जाने के लिए असाइन कर सकते हैं।
from django.core.exceptions import ObjectDoesNotExist
try:
go = Content.objects.get(name="baby")
except ObjectDoesNotExist:
go = None
आप इसके लिए एक सामान्य कार्य बना सकते हैं।
def get_or_none(classmodel, **kwargs):
try:
return classmodel.objects.get(**kwargs)
except classmodel.DoesNotExist:
return None
नीचे इस तरह का प्रयोग करें:
go = get_or_none(Content,name="baby")
यदि कोई प्रविष्टि मैच सामग्री प्रविष्टि वापस नहीं आएगी तो कोई भी नहीं जाएगा।
ध्यान दें: यदि अपवाद एक से अधिक प्रविष्टि नाम = "बच्चे" के लिए लौटा है, तो यह एकाधिकऑबजेक्ट्स को छोड़ देगा।
आप इसे इस तरह से कर सकते हैं:
go = Content.objects.filter(name="baby").first()
अब चर जा सकता है या तो आप चाहते हैं या कोई भी वस्तु हो सकता है
रेफरी: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.first
चीजों को आसान बनाने के लिए, यहाँ मैंने जो कोड लिखा है उसका एक स्निपेट अद्भुत उत्तरों से प्राप्त इनपुट के आधार पर है:
class MyManager(models.Manager):
def get_or_none(self, **kwargs):
try:
return self.get(**kwargs)
except ObjectDoesNotExist:
return None
और फिर अपने मॉडल में:
class MyModel(models.Model):
objects = MyManager()
बस। अब आपके पास MyModel.objects.get () साथ ही MyModel.objetcs.get_or_none () है
आप exists
एक फिल्टर के साथ उपयोग कर सकते हैं :
Content.objects.filter(name="baby").exists()
#returns False or True depending on if there is anything in the QS
यदि आप केवल यह जानना चाहते हैं कि क्या मौजूद है, तो इसके लिए एक विकल्प
exists()
साथ उपयोग किया जाएगा, if
जिससे db पर दोहरी मार पड़ेगी । यदि मैं किसी और की मदद करता है, तो मैं अभी भी टिप्पणी चारों ओर रखूंगा।
आपके विचारों में विभिन्न बिंदुओं पर अपवादों को संभालना वास्तव में बोझिल हो सकता है। एक कस्टम मॉडल प्रबंधक को परिभाषित करने के बारे में, मॉडल फ़ाइल में, जैसे
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:
# Do something
else:
# This post doesn't exist
return self.get(**kwargs)
मेरे लिए काम कर सके। उत्तर के साथ कुछ भी गलत नहीं कहने के लिए, बाद के संस्करणों के साथ इसका उपयोग करने की कोशिश करने वाले किसी भी व्यक्ति के लिए सिर्फ एक टिप (या मेरे साथ काम करने से इसे जो कुछ भी रखा गया है)।
यह उन कष्टप्रद कार्यों में से एक है जिन्हें आप फिर से लागू नहीं करना चाहते हैं:
from annoying.functions import get_object_or_None
#...
user = get_object_or_None(Content, name="baby")
get_object_or_None
लेकिन पाया कि यह अभी भी बढ़ा है MultipleObjectsReturned
अगर एक से अधिक ऑब्जेक्ट। इसलिए, उपयोगकर्ता एक के साथ आस-पास विचार कर सकता है try-except
(जो फ़ंक्शन में try-except
पहले से ही है)।
मुझे लगता है कि इसका इस्तेमाल करना बुरा नहीं है get_object_or_404()
from django.shortcuts import get_object_or_404
def my_view(request):
my_object = get_object_or_404(MyModel, pk=1)
यह उदाहरण इसके बराबर है:
from django.http import Http404
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
raise Http404("No MyModel matches the given query.")
आप django के ऑनलाइन दस्तावेज़ में get_object_or_404 () के बारे में अधिक पढ़ सकते हैं ।
Django 1.7 के बाद से आप ऐसा कर सकते हैं:
class MyQuerySet(models.QuerySet):
def get_or_none(self, **kwargs):
try:
return self.get(**kwargs)
except self.model.DoesNotExist:
return None
class MyBaseModel(models.Model):
objects = MyQuerySet.as_manager()
class MyModel(MyBaseModel):
...
class AnotherMyModel(MyBaseModel):
...
"MyQuerySet.as_manager ()" का लाभ यह है कि निम्नलिखित दोनों काम करेंगे:
MyModel.objects.filter(...).get_or_none()
MyModel.objects.get_or_none()
यहाँ सहायक फ़ंक्शन पर एक भिन्नता है जो आपको एक QuerySet
उदाहरण में वैकल्पिक रूप से पारित करने की अनुमति देती है , यदि आप मॉडल के all
ऑब्जेक्ट क्वेरीसेट के अलावा अन्य किसी क्वेरी से अद्वितीय ऑब्जेक्ट (यदि वर्तमान) प्राप्त करना चाहते हैं (जैसे कि बच्चे से संबंधित आइटमों के सबसेट से) मूल उदाहरण):
def get_unique_or_none(model, queryset=None, **kwargs):
"""
Performs the query on the specified `queryset`
(defaulting to the `all` queryset of the `model`'s default manager)
and returns the unique object matching the given
keyword arguments. Returns `None` if no match is found.
Throws a `model.MultipleObjectsReturned` exception
if more than one match is found.
"""
if queryset is None:
queryset = model.objects.all()
try:
return queryset.get(**kwargs)
except model.DoesNotExist:
return None
यह दो तरीकों से इस्तेमाल किया जा सकता है, जैसे:
obj = get_unique_or_none(Model, **kwargs)
जैसा कि प्रीवियस ने चर्चा कीobj = get_unique_or_none(Model, parent.children, **kwargs)
बिना अपवाद के:
if SomeModel.objects.filter(foo='bar').exists():
x = SomeModel.objects.get(foo='bar')
else:
x = None
एक अपवाद का उपयोग करना:
try:
x = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
x = None
जब अजगर को एक अपवाद का उपयोग करना चाहिए, तो इसके बारे में थोड़ा तर्क है। एक ओर, "अनुमति के लिए क्षमा मांगना अधिक आसान है"। जबकि मैं इस बात से सहमत हूं, मेरा मानना है कि एक अपवाद रहना चाहिए, ठीक है, अपवाद, और "आदर्श मामला" बिना किसी को मार दिए चलना चाहिए।
हम Django बिलिन अपवाद का उपयोग कर सकते हैं जो कि नामित मॉडल से जुड़ा हुआ है .DoesNotExist
। इसलिए, हमें ObjectDoesNotExist
अपवाद आयात करने की आवश्यकता नहीं है ।
इसके बजाय:
from django.core.exceptions import ObjectDoesNotExist
try:
content = Content.objects.get(name="baby")
except ObjectDoesNotExist:
content = None
हम यह कर सकते हैं:
try:
content = Content.objects.get(name="baby")
except Content.DoesNotExist:
content = None
यह Django के get_object_or_404 से एक कॉपीकैट है सिवाय इसके कि विधि कोई भी नहीं लौटाता है। यह अत्यंत उपयोगी है जब हमें only()
क्वेरी का उपयोग केवल कुछ क्षेत्रों को पुनः प्राप्त करने के लिए करना होता है। यह विधि एक मॉडल या एक क्वेरी को स्वीकार कर सकती है।
from django.shortcuts import _get_queryset
def get_object_or_none(klass, *args, **kwargs):
"""
Use get() to return an object, or return None if object
does not exist.
klass may be a Model, Manager, or QuerySet object. All other passed
arguments and keyword arguments are used in the get() query.
Like with QuerySet.get(), MultipleObjectsReturned is raised if more than
one object is found.
"""
queryset = _get_queryset(klass)
if not hasattr(queryset, 'get'):
klass__name = klass.__name__ if isinstance(klass, type) else klass.__class__.__name__
raise ValueError(
"First argument to get_object_or_none() must be a Model, Manager, "
"or QuerySet, not '%s'." % klass__name
)
try:
return queryset.get(*args, **kwargs)
except queryset.model.DoesNotExist:
return None
शायद आप का उपयोग बेहतर है:
User.objects.filter(username=admin_username).exists()