潭州課堂25班:Ph201805201 django 專案 第二十八課 新聞elasticsearch搜尋前後功臺能實現 (課堂筆記)
阿新 • • 發佈:2018-12-28
在apps/news/search_indexes.py中建立如下類:(名稱固定為search_indexes.py)
# -*-# -*- coding: utf-8 -*- # 斌彬電腦 # @Time : 2018/10/12 0012 8:47 from haystack import indexes # from haystack import site from .models import News class NewsIndex(indexes.SearchIndex, indexes.Indexable): """ News索引資料模型 類 """ text = indexes.CharField(document=True, use_template=True) id = indexes.IntegerField(model_attr='id') title = indexes.CharField(model_attr='title') digest = indexes.CharField(model_attr='digest') content = indexes.CharField(model_attr='content') image_url = indexes.CharField(model_attr='image_url') # comments = indexes.IntegerField(model_attr='comments') def get_model(self): """ 返回建立索引的模型類 """ return News def index_queryset(self, using=None): """ 返回要建立索引的資料查詢集 :param using: :return: """ # 條件:把未被邏輯刪除的,進行搜尋 return self.get_model().objects.filter(is_delete=False, tag_id=1) # return self.get_model().objects.filter(is_delete=False, tag_id__in=[1, 2, 3, 4, 5, 6])
後臺檢視
from haystack.views import SearchView as _SearchView class SearchView(_SearchView): # 模版檔案 template = 'news/search.html' # 重寫響應方式,如果請求引數q為空,返回模型News的熱門新聞資料,否則根據引數q搜尋相關資料 def create_response(self): kw = self.request.GET.get('q', '') if not kw: show_all = True hot_news = models.HotNews.objects.select_related('news'). \ only('news__title', 'news__image_url', 'news__id'). \ filter(is_delete=False).order_by('priority', '-news__clicks') paginator = Paginator(hot_news, settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE) try: page = paginator.page(int(self.request.GET.get('page', 1))) except PageNotAnInteger: # 如果引數page的資料型別不是整型,則返回第一頁資料 page = paginator.page(1) except EmptyPage: # 使用者訪問的頁數大於實際頁數,則返回最後一頁的資料 page = paginator.page(paginator.num_pages) return render(self.request, self.template, locals()) else: show_all = False qs = super(SearchView, self).create_response() return qs