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

كيف يمكنني دمج اثنين أو أكثر من queryset معًا في جانغو Django؟

Amer Abdallah

السؤال

أحاول بناء صفحة للبحث في موقع مبني بـ جانغو Django، وفي صفحة البحث هذه، أبحث في نموذجين models مختلفة (posts و pages). وللحصول على ترقيم صفحات في صفحة نتائج البحث، أود استخدام object_list لعرض النتائج. ولكن للقيام بذلك ، يتعين عليّ دمج نتائج البحث للنموذجين معًا

results = []	# قائمة نتائج البحث النهائية

pages = Page.objects.filter(Q(title__icontains=term) | Q(body__icontains=term))
for x in pages:
    results.append(x)
    
posts = Post.objects.filter(Q(title__icontains=term) | Q(body__icontains=term))
for x in posts:
    results.append(x)

return object_list(
    request,
    queryset=results,
    template_object_name='result',
    paginate_by=15,
    extra_context={'term': term},
    template_name="search/results.html")

لكن الكود السابق لا يعمل.و أحصل على خطأ عندما أحاول استخدام تلك القائمة في ملفات العرض.

كيف يمكنني دمج كل من pages و posts معًا؟

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

Recommended Posts

  • 1

يمكنك استخدام itertools.chain حيث يعتبر أسرع من تكرار كل قائمة وإلحاق العناصر واحدة تلو الأخرى . كما أنها تستهلك ذاكرة أقل من تحويل كل مجموعة استعلام إلى قائمة قبل التسلسل.

from itertools import chain
result_list = list(chain(page_list, post_list))

من الممكن الآن فرز القائمة الناتجة على سبيل المثال حسب التاريخ باستخدام الدالة Sorted , تقبل الدالة Sorted () generator وترجع قائمة كالتالي

result_list = sorted(
    chain(page_list, post_list),
    key=lambda instance: instance.date_created)

إذا كنت تستخدم Python 2.4 أو إصدارًا أحدث ، فيمكنك استخدام Attrgetter بدلاً من lambda ولكن لا يوجد فرق كبير بينهما

from operator import attrgetter
result_list = sorted(
    chain(page_list, article_list, post_list),
    key=attrgetter('date_created'))

 

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

  • 0

يمكنك تجربة الطريقة التالية التي تحتفظ بجميع التوابع لمجموعات الاستعلامات "querysets":

#أو عمليات مشابهة order_by  هذه الطريقة ممتازة في حال أردت القيام ب
matches = pages | articles | posts
#من نموذجين مختلفين querysets  لكن هذه الطريقة لاتعمل في حال

كما يمكنك استخدام QuerySet.union:

qs = qs1.union(qs2, qs3)

لكن إذا أردت تطبيق order_by :

qs = qs1.union(qs2.select_related("foreignModel"), qs3.select_related("foreignModel"))
qs.order_by("foreignModel__prop1")

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...