Django模糊查询---Q查询
def search(request): searchtype = request.POST.get("searchtype") keyword = request.POST.get("keyword") if searchtype == "all": #多个字段模糊查询, 括号中的下划线是双下划线,双下划线前是字段名,双下划线后可以是icontains或contains,区别是是否大小写敏感,竖线是或的意思 sciencenews = models.Sciencenews.objects.filter(Q(title__icontains=keyword)\ |Q(content__icontains=keyword)|Q(author__icontains=keyword)) elif searchtype == "author": #单个字段模糊查询 sciencenews = models.Sciencenews.objects.filter(author__icontains=keyword) elif searchtype == "title": sciencenews = models.Sciencenews.objects.filter(title__icontains=keyword) elif searchtype == "content": sciencenews = models.Sciencenews.objects.filter(content__icontains=keyword) else: #使用点连接的filter链表示and sciencenews = models.Sciencenews.objects.filter(author__icontains=keyword).\ filter(title__icontains=keyword).filter(content__icontains=keyword) return render(request,"show/index.html",{"param":sciencenews,"searchtype":searchtype,"keyword":keyword})
1、Q查询补充
示例一:
- q=Q() # 实例化一个Q的对象q,我们可以给它加条件
- q.children.append(("name","alex")) # 添加筛选条件,即name字段为alex的记录
- # 再添加一个条件,即gender字段为男,与上一个筛选条件的关系默认是"且",即叫alex的男同学
- q.children.append(("gender","男"))
- Student.objects.filter(q) # 过滤name为alex的男同学
示例二:
- q=Q() # 实例化一个Q的对象q
- q.children.append(("name__contains","赵")) # 添加筛选条件
- Student.objects.filter(q) # 过滤name字段中包含"赵"的同学
示例三:
- # 改为"或"的关系
- q=Q() # 实例化一个Q的对象q
- q.connertor="or" # 改为"或"的关系
- q.children.append(("name","alex"),("gender","男"))
- Student.objects.filter(q) # 过滤name为alex或者性别是男的所有同学
- # 注意:上面示例中都是确定字段,即name字段为alex,gender字段为男,最重要的是q对象中条件元组中除了字符串,也可以是变量。
def search(self, field_list): # 构建Q对象 # Q(Q(qq__contains=query) | Q(name__contains=query) | Q(phone__contains=query)) query = self.request.GET.get('query', '') q = Q() # 实例化一个Q的对象q,我们可以给它加条件 q.connector = 'OR' for field in field_list: q.children.append(Q(('{}__contains'.format(field), query))) #在这里给q对象加条件 return q
浙公网安备 33010602011771号