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

أسرع طريقة للحصول على الكائن الأول من queryset في جانغو Django؟

Amer Abdallah

السؤال

غالبًا ما أجد نفسي أرغب في الحصول على الكائن الأول من queryset في جانغو Django، أو إعادة None إذا لم يكن هناك أي كائن. هناك العديد من الطرق للقيام بذلك والتي تعمل جميعها. لكني أتساءل أيهما صاحب أفضل أداءً.

users = User.objects.filter(role = 'admin')
if users.count() > 0:
    return users[0]
else:
    return None

هل ينتج عن هذا استدعائين لقاعدة البيانات؟ هذا يبدو مضيعة للوقت مقارنة بالكود التالي (أعتقد أنه أسرع)؟

users = User.objects.filter(role = 'admin')
if len(users) > 0:
    return users[0]
else:
    return None

الخيار الآخر هو إستخدام جملة Try ... Except:

users = User.objects.filter(role = 'admin')
try:
    return users[0]
except IndexError:
    return None

هذا يولد استدعاء قاعدة بيانات واحدة ، وهو أمر جيد. ولكن يتطلب إنشاء كائن استثناء (من الصنف IndexError) في كثير من الأحيان، وهو أمر يتطلب الكثير من الذاكرة، خصوصًا مع عدد كبير من الزيارات المتزامنة.

كيف يمكنني القيام بذلك من خلال استدعاء قاعدة بيانات واحد فقط وأسرع طريقة ممكنة؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 2

لاحظ أن في جميع الطريق السابقة، يتم جلب كل الكائنات التي لديها الخاصية role بقيمة admin، بينما يتم إستخدام فقط الأول كائن، ولا حاجة لطلب كل الكائنات الأخرى من قاعدة البيانات، لذلك يوفر Django التابع first والذي يقوم بجلب أول كائن فقط من قاعدة البيانات، وفي حالة لم يستطع العثور على أي منها سوف يقوم بإرجاع None، وهو ما ترغب به بالضبط.

يتم إستخدام التابع first على النحو التالي:

users = User.objects.filter(role = 'admin').first()

كما يوفر Django التابع last والذي يقوم بنفس وظيفة التابع first بإستثناء أنه يعيد آخر كائن من قاعدة البيانات وليس الأول.

users = User.objects.filter(role = 'admin').last()

كما يمكنك جلب كل الكائنات من قاعدة البيانات (في حالة كنت بحاجة إليها في وقت لاحق)، وفي نفس الوقت تستطيع إستخدام التابع first بالشكل التالي:

users = User.objects.filter(role = 'admin').all()
firstUser = users.first()

بهذه الطريقة سيكون لديك كل كائنات النموذج User وفي نفس الوقت تستطيع الحصول على أول كائن منهم بدون عمل إستعلام جديد في قاعدة البيانات، وفي حالة لم يتم العثور على أي كائنات سوف يتم إعادة None.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك أيضاً استخدام مفهوم ال array slicing:

Entry.objects.all()[:1].get()

والتي من الممكن استخادمها مع filter:

Entry.objects.filter()[:1].get()

من الضروري أن تضع get لكي تحصل على object، وإلا ستحصل على QuerySet.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك استخدام هذه الطريقة للقيام بذلك

r = list(qs[:1])
if r:
  return r[0]
return None

أو استخدام الطريقة التالية

def get_first_element(MyModel):
    my_query = MyModel.objects.all()
    return my_query[:1]

إذا كانت فارغة ، فستعيد قائمة فارغة ، وإلا فإنها ترجع العنصر الأول داخل القائمة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...