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

时间:2015-10-06 21:08:43

标签: 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)

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

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

1 个答案:

答案 0 :(得分: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)

由于Django的QuerySets很懒惰,因此应该在numresults = len(query)行之前调用SQL调用