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查询补充

示例一:

  1.   q=Q() # 实例化一个Q的对象q,我们可以给它加条件
  2.   q.children.append(("name","alex")) # 添加筛选条件,即name字段为alex的记录
  3.   # 再添加一个条件,即gender字段为男,与上一个筛选条件的关系默认是"且",即叫alex的男同学
  4.   q.children.append(("gender","男"))
  5.   Student.objects.filter(q) # 过滤name为alex的男同学

示例二:

  1.   q=Q() # 实例化一个Q的对象q
  2.   q.children.append(("name__contains","赵")) # 添加筛选条件
  3.   Student.objects.filter(q) # 过滤name字段中包含"赵"的同学

示例三:

  1. # 改为"或"的关系
  2.   q=Q() # 实例化一个Q的对象q
  3.   q.connertor="or" # 改为"或"的关系
  4.   q.children.append(("name","alex"),("gender","男"))
  5.   Student.objects.filter(q) # 过滤name为alex或者性别是男的所有同学
  6.   # 注意:上面示例中都是确定字段,即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

 

 

posted @ 2019-10-12 22:32  AnthonyWang  阅读(263)  评论(0)    收藏  举报