Django - 将代码转换为django查询?

Pro*_*joe 0 python django postgresql

所以我在我的一个模型上有这个django查询,我有一些额外的python代码,用于在每个查询之间进行额外的工作.我正在寻找一些帮助,将这块代码转换为单个django查询,因为我知道你应该让数据库完成大部分工作.

查询代码如下.

keywords = []
if query:
   results = []
   keywords = query.split()
   for x in keywords:
      res = Textbook.objects.filter(Q(class_name__icontains=x) |
                                    Q(textbook_name__icontains=x) |
                                    Q(author__icontains=x) |
                                    Q(isbn__icontains=x))
      if len(results) == 0:
         results = res
      else:
         results = set(results) & set(res)

numresults = len(results)
Run Code Online (Sandbox Code Playgroud)

因此查询是我从用户那里获取的信息.我将此信息拆分为关键字并对每个关键字进行查询.他们正在搜索教科书,因此如果他们输入的任何单词与书籍的isbn,title,class name或作者相匹配,则会将其添加到结果中.但是,如果他们使用多个单词,我只会将其添加到结果中,如果两个单词都将该书作为查询返回.这就是结果=设置(结果)和设置(res)的结果.如果当前结果和新查询返回同一本书,请将其保留在结果中.

我知道这很糟糕所以我正在寻找一种方法来改善它.

Rit*_*ave 8

您可以在循环中执行其他过滤器而不是set-intersection:

keywords = []
if query:
    results = []
    keywords = query.split()
    query = Textbook.objects.all()
    for x in keywords:
        query = query.filter(Q(class_name__icontains = x) | Q(textbook_name__icontains = x) | Q(author__icontains = x) | Q(isbn__icontains = x))

numresults = len(query)
Run Code Online (Sandbox Code Playgroud)

由于Django的QuerySets是懒惰的,因此SQL调用应该被删除直到numresults = len(query)