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

السؤال

نشر

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...