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)的结果.如果当前结果和新查询返回同一本书,请将其保留在结果中.
我知道这很糟糕所以我正在寻找一种方法来改善它.
您可以在循环中执行其他过滤器而不是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)行