我在我正在开发的网站上成功实现了搜索功能,但我想知道是否有更有效的方法来做到这一点。基本上,在搜索输入字段中输入会多次查询数据库。有没有更好的方法来优化代码?
const filterSearch = async () => {
try {
const courses_response = await fetch(`api/courses?query=${searchText}`, {
method: "GET",
});
const articles_response = await fetch(
`api/articles?query=${searchText}`,
{
method: "GET",
}
);
const quicklinks_response = await fetch(
`api/quicklinks?query=${searchText}`,
{
method: "GET",
}
);
const courses_data = await courses_response.json();
const articles_data = await articles_response.json();
const quicklinks_data = await quicklinks_response.json();
setCourses(courses_data);
setArticles(articles_data);
setQuickLinks(quicklinks_data);
} catch (error) {
console.log(error);
}
};
<div className="input-btn">
<input
name="search"
type="search"
placeholder="Search courses, articles and links"
value={searchText}
onChange={(e) => setSearchText(e.target.value)}
autoFocus
/>
<button onClick={searchQuery} className="btn-submit" type="button">
<LiaSearchSolid />
</button>
</div>
Views.py
class QuickLinksView(generics.ListCreateAPIView):
serializer_class = QuickLinkSerializer
queryset = QuickLinks.objects.all()
def get_queryset(self):
search = self.request.query_params.get('query')
if search != "" and search is not None:
return QuickLinks.objects.all().filter(Q(title__icontains=search) | Q(excerpt__icontains=search)).distinct()
您不需要调用 QuickLinks.objects.all() 两次:
class QuickLinksView(generics.ListCreateAPIView):
serializer_class = QuickLinkSerializer
queryset = QuickLinks.objects.all()
def get_queryset(self):
search = self.request.query_params.get('query')
if search:
return self.queryset.filter(Q(title__icontains=search) | Q(excerpt__icontains=search)).distinct()