目录
内容介绍:
在B站黑马程序员“P218 搜索实现”中的代码有些许错误,本博客重构了错误的API
1. 错误代码展示:
# 导入:
from haystack.views import SearchView
from django.http import JsonResponse
class MySearchView(SearchView):
'''重写SearchView类'''
def create_response(self):
# 获取搜索结果
context = self.get_context()
data_list = []
for sku in context['page'].object_list:
data_list.append({
'id':sku.object.id,
'name':sku.object.name,
'price':sku.object.price,
'default_image_url':sku.object.default_image.url,
'searchkey':context.get('query'),
'page_size':context['page'].paginator.num_pages,
'count':context['page'].paginator.count
})
# 拼接参数, 返回
return JsonResponse(data_list, safe=False)
2. 错误分析:
- 可能是自己的Django版本号选用的是 django4版本, 而这个项目讲解使用的django2
- 可能是自己安装的Django版本不一致,默认安装的 drf-haystack库版本不一致,导致重写SearchView的类方法 create_response行不通
3. 代码重构:
经过去官网查询 haystack这个库的API我使用重写了一些这个函数,根据 Search类中的get_context() 方法,重写了一个相似功能的Django的类视图。
from haystack.query import SearchQuerySet
class SearchView(View):
def get(self, request):
# page是第几页, page_size一页几个数据, q是查询字符串
page = request.GET.get('page')
page_size = request.GET.get('page_size')
q = request.GET.get('q')
if not all([page, page_size, q]):
return JsonResponse({'code': 0, "errmsg": "参数不全"})
# 执行搜索
sku = SearchQuerySet().filter(content=q)
# 分页
paginator = Paginator(sku, page_size)
# 获取每页商品数据
try:
page_skus = paginator.page(page)
except EmptyPage:
# 如果page_num不正确,默认给用户400
return JsonResponse({'code': 400,
'errmsg': 'page数据出错'})
# 获取列表页总页数
total_page = paginator.num_pages
# 将搜索结果转换为字典列表
sku_list = []
for result in page_skus: # 限制结果数量(可选)
sku_list.append({
'id': result.object.id,
'name': result.object.name,
'price': result.object.price,
'default_image_url': result.object.default_image.url,
'searchkey': q,
'page_size': page_size,
'count': total_page
}
)
return JsonResponse(sku_list, safe=False)