使用 Next.js 和 Django Rest Framework 一次过滤多个模型

问题描述 投票:0回答:1

我在我正在开发的网站上成功实现了搜索功能,但我想知道是否有更有效的方法来做到这一点。基本上,在搜索输入字段中输入会多次查询数据库。有没有更好的方法来优化代码?

以下是Next.js中的搜索功能:

  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>

Django 中的三个端点分别如下所示:

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()
django-models django-rest-framework full-text-search next.js13
1个回答
0
投票

您不需要调用 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()
    
© www.soinside.com 2019 - 2024. All rights reserved.