所以我在我的一个模型上有这个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)确实如此。如果当前结果和新查询返回同一本书,请将其保留在结果中。
我知道这很糟糕所以我正在寻找一种方法来改善它。
答案 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调用