اذهب إلى المحتوى

السؤال

نشر

عندما أطلب من نموذج الحصول على كائن معين، فإنه يظهر خطأ DoesNotExist عندما لا يكون هناك كائن مطابق.

writers = User.objects.get(role="writer")	# DoesNotExist 

بدلاً من ظهور خطأ DoesNotExist، كيف يمكنني أن أجبره على إعاده None بدلاً من ذلك في حالة عدم وجود الكائن؟

 

Recommended Posts

  • 1
نشر

لا توجد طريقة "built-in" للقيام بذلك في Django بشكل إفتراضي. سيظهر Django استثناء DoesNotExist في كل مرة. الطريقة الأسهل للتعامل مع هذا في Python هي إستخدام جملة try .. except، كالتالي:

try:
    writers = User.objects.get(role="writer")
except User.DoesNotExist:
    writers = None

ما فعلته هوإستخدام نوع الخطأ User.DoesNotExist للتأكد من وجود الكائن، بهذه الطريقة يمكنك معرفة إن لم يوجد أي كتاب writers في الموقع، يمكنك أيضًا أن تستخدم نوع الخطأ ObjectDoesNotExist كالتالي:

from django.core.exceptions import ObjectDoesNotExist

try:
    writers = User.objects.get(role="writer")
except ObjectDoesNotExist:
    writers = None

وفي حالة كنت تريد أن يتم إحضار أو كائن فقط، فيمكنك أن تستخدم التابع first، كالتالي:

User.objects.filter(role="writer").first()

في حالة أردت التأكد فقط من وجود الكائن في قاعدة البيانات، فيمكنك أن تستعمل exists، كالتالي:

User.objects.filter(role="writer").exists()

 

  • 0
نشر (معدل)

إضافة لإجابة سامح الرئعة يمكنك إنشاء دالة للقيام بهذه المهمة:

def chk(model, **kwargs):
    try:
        return model.objects.get(**kwargs)
    except model.DoesNotExist:
        return None
# واستخدمها بالشكل التالي
get = chk(Content,role="writer")
#في حالة عدم التطابق None القيمة get ستعيد
#Content وإلا ستعيد ال
# MultipleObjectsReturned  سيعيد الاستثناء
#role="writer" إذا تم إرجاع أكثر من إدخال واحد ل
# لذا يجب التقاط هذا الاستثناء لكي لايتسبب بمشاكل 
def chk(model, **kwargs):
    try:
        return model.objects.get(**kwargs)
    except model.MultipleObjectsReturned as e:
        print(e)
    except model.DoesNotExist:
        return None

كذلك هناك الدالة get_object_or_None من الموديول annoying.functions :

from annoying.functions import get_object_or_None as get
#....
go = get(Content, role="writer")

 

تم التعديل في بواسطة Ali Haidar Ahmad

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...