উত্তর:
এটি করার মতো কোনও 'বিল্ট ইন' উপায় নেই। জ্যাঙ্গো প্রতিবারই ডোন নটএক্সিস্ট ব্যতিক্রম বাড়িয়ে তুলবে। অজগরটিকে এটিকে হ্যান্ডেল করার অদ্ভুত উপায়টি হ'ল এটি চেষ্টা করে ধরুন:
try:
go = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
go = None
আমি যা করেছি তা হ'ল সাবক্লাস মডেলগুলি an safe_get
ম্যানেজার, উপরের কোডের মতো একটি তৈরি করুন এবং আমার মডেলগুলির জন্য সেই ব্যবস্থাপকটি ব্যবহার করুন। এই ভাবে আপনি লিখতে পারেন: SomeModel.objects.safe_get(foo='bar')
।
SomeModel.objects.filter(foo='bar').first()
এই প্রথম ম্যাচটি বা কোনওটিই প্রদান করে না। এটি ব্যর্থ হয় না যদি এর মতো বেশ কয়েকটি দৃষ্টান্ত রয়েছেqueryset.get()
filter().first()
আমার মনে হয় ব্যতিক্রমটি যাওয়ার উপায়।
জাজানো ১.6 থেকে আপনি প্রথম () পদ্ধতিটি এর মতো ব্যবহার করতে পারেন :
Content.objects.filter(name="baby").first()
get()
DoesNotExist
প্রদত্ত প্যারামিটারগুলির জন্য কোনও অবজেক্ট না পাওয়া গেলে একটি ব্যতিক্রম উত্থাপন করে । এই ব্যতিক্রমটি মডেল শ্রেণির একটি বৈশিষ্ট্যও।DoesNotExist
থেকে ব্যতিক্রম উত্তরাধিকারীdjango.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 () পাশাপাশি মাইমোডেল.ওবজেটস.সেট_অর_নোন () রয়েছে
আপনি exists
একটি ফিল্টার সঙ্গে ব্যবহার করতে পারে :
Content.objects.filter(name="baby").exists()
#returns False or True depending on if there is anything in the QS
আপনি কেবল এটির বিদ্যমান কিনা তা জানতে চাইলে কেবল তার বিকল্প
exists()
সহ ব্যবহার করা হবে if
। অন্য কারও সাহায্য করার ক্ষেত্রে আমি এখনও মন্তব্যটি রাখব।
আপনার মতামতের বিভিন্ন পয়েন্টে ব্যতিক্রমগুলি হ্যান্ডেল করা সত্যিই জটিল হতে পারে..এমন মডেলস.পি ফাইলটিতে একটি কাস্টম মডেল ম্যানেজারের সংজ্ঞা দেওয়ার বিষয়ে কি?
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()
এইভাবে এটি সহজেই ভিউগুলিতে ডিল করা যায় ie
post = Content.objects.get_nicely(pk = 1)
if post:
# Do something
else:
# This post doesn't exist
return self.get(**kwargs)
আমার কাছে কাজ করার জন্য কনটেন্ট ম্যানেজারে ফিরতি পরিবর্তন করে একটি নোট রাখতে চেয়েছিলেন to উত্তরের সাথে কোনওরকম ভুল না বলা, পরবর্তী সংস্করণগুলির সাথে (বা অন্য যে কোনও কিছুই এটি আমার পক্ষে কাজ করা থেকে বিরত রেখেছে) ব্যবহার করে চেষ্টা করার জন্য কেবল একটি টিপ।
এটি এমন একটি বিরক্তিকর ফাংশন যা আপনি পুনরায় প্রয়োগ করতে চান না:
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.")
আপনি জাজো অনলাইন ডকুমেন্টেশনে get_object_or_404 () সম্পর্কে আরও পড়তে পারেন ।
জ্যাঙ্গো ১.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):
...
"মাইকিউয়ারিসেট.আস_ম্যানেজার ()" এর সুবিধাটি হ'ল নীচের উভয়টিই কাজ করবে:
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)
হিসাবে previosuly আলোচনা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
পাইথনটিতে কারও ব্যতিক্রম কখন ব্যবহার করা উচিত সে সম্পর্কে একটি যুক্তি রয়েছে। একদিকে, "অনুমতি চেয়ে ক্ষমা চাওয়া সহজ"। আমি এটির সাথে একমত হওয়ার পরেও আমি বিশ্বাস করি যে একটি ব্যতিক্রম অব্যাহত থাকা উচিত, ভাল, ব্যতিক্রম এবং "আদর্শ কেস "টি কোনও আঘাত না করে চালানো উচিত।
আমরা জাজানো বিল্টিন ব্যতিক্রমগুলি ব্যবহার করতে পারি যা নাম হিসাবে চিহ্নিত মডেলগুলির সাথে সংযুক্ত .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
এটি জ্যাঙ্গোর 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()