|
|
|
|
@ -5,23 +5,51 @@ from blog.models import Article, Category
|
|
|
|
|
|
|
|
|
|
class BlogApi:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
# 初始化Haystack的搜索查询集(SearchQuerySet)
|
|
|
|
|
self.searchqueryset = SearchQuerySet()
|
|
|
|
|
# 执行空关键词自动查询,初始化查询集(无实际筛选,仅构建基础查询对象)
|
|
|
|
|
self.searchqueryset.auto_query('')
|
|
|
|
|
# 定义默认最大返回数量:最多返回8条数据
|
|
|
|
|
self.__max_takecount__ = 8
|
|
|
|
|
|
|
|
|
|
def search_articles(self, query):
|
|
|
|
|
"""
|
|
|
|
|
根据关键词搜索文章
|
|
|
|
|
:param query: 搜索关键词
|
|
|
|
|
:return: 匹配的文章查询集(最多8条)
|
|
|
|
|
"""
|
|
|
|
|
# 基于关键词执行自动查询(Haystack会处理分词、索引匹配等逻辑)
|
|
|
|
|
sqs = self.searchqueryset.auto_query(query)
|
|
|
|
|
# 加载关联的完整模型数据(避免后续访问关联字段时触发额外数据库查询)
|
|
|
|
|
sqs = sqs.load_all()
|
|
|
|
|
# 返回前N条结果(N=__max_takecount__)
|
|
|
|
|
return sqs[:self.__max_takecount__]
|
|
|
|
|
|
|
|
|
|
def get_category_lists(self):
|
|
|
|
|
"""
|
|
|
|
|
获取所有文章分类
|
|
|
|
|
:return: 所有Category模型对象的查询集
|
|
|
|
|
"""
|
|
|
|
|
# 查询并返回所有分类(无数量限制,因分类通常数量较少)
|
|
|
|
|
return Category.objects.all()
|
|
|
|
|
|
|
|
|
|
def get_category_articles(self, categoryname):
|
|
|
|
|
"""
|
|
|
|
|
根据分类名称获取该分类下的文章
|
|
|
|
|
:param categoryname: 分类名称
|
|
|
|
|
:return: 该分类下的文章查询集(最多8条),无匹配时返回None
|
|
|
|
|
"""
|
|
|
|
|
# 筛选分类名称匹配的文章(通过外键category关联查询)
|
|
|
|
|
articles = Article.objects.filter(category__name=categoryname)
|
|
|
|
|
# 若有匹配文章,返回前8条;无匹配则返回None
|
|
|
|
|
if articles:
|
|
|
|
|
return articles[:self.__max_takecount__]
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def get_recent_articles(self):
|
|
|
|
|
return Article.objects.all()[:self.__max_takecount__]
|
|
|
|
|
"""
|
|
|
|
|
获取最新发布的文章
|
|
|
|
|
:return: 最新的文章查询集(最多8条)
|
|
|
|
|
"""
|
|
|
|
|
# 查询所有文章,默认按主键降序(通常主键自增,等价于按发布时间降序),返回前8条
|
|
|
|
|
return Article.objects.all()[:self.__max_takecount__]
|