• 1

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

أحاول بناء صفحة للبحث في موقع مبني بـ جانغو 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 معًا؟

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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'))

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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")

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


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

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن