关于做前端搜索 后台django代码查询

需求:

       有时候我们数据表格的时候,数据展示的时候,需要搜索功能。

前端url:http://xxxx/data?search=333&order=asc&offset=0&limit=10

后端通过获取search字段内容。然后从后端数据库中匹配相应的数据,这个匹配是模糊匹配

这就是涉及到django的sql语句的模糊查询。

这里涉及到一个知识点Q对象。

1 from django.db.models import Q
2 search_obj=host.objects.filter(Q(IP__contains="%s"%(search_request))|
3                                        Q(status__icontains="%s"%(search_request))|
4                                        Q(name__icontains="%s"%(search_request)))

 

我们可以使用符号&或者|将多个Q()对象组合起来传递给filter(),exclude(),get()等函数。当多个Q()对象组合起来时,Django会自动生成一个新的Q()。例如下面代码就将两个条件组合成了一个

1 Q(question__startswith='Who') | Q(question__startswith='What')

 

使用上述代码可以使用SQL语句这么理解:

1 WHEREquestionLIKE 'Who%' ORquestionLIKE 'What%'

 

我们可以在Q()对象的前面使用字符“~”来代表意义“非”,例如下面代码:

1 Q(question__startswith='Who') | ~Q(pub_date__year=2005) 

对应SQL语句可以理解为:

1 WHEREquestionlike "Who%" ORyear(pub_date) !=2005

 

这样我们可以使用 “&”或者“|”还有括号来对条件进行分组从而组合成更加复杂的查询逻辑。

也可以传递多个Q()对象给查询函数,例如下面代码:

1 News.objects,get(
2     Q(question__startswith='Who'),
3     Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
4 )

多个Q()对象之间的关系Django会自动理解成“且(and)”关系。如上面代码使用SQL语句理解将会是:

1 SELECT * fromnewsWHEREquestionLIKE 'Who%'  AND (pub_date = '2005-05-02' ORpub_date = '2005-05-06') 

Q()对象可以结合关键字参数一起传递给查询函数,不过需要注意的是要将Q()对象放在关键字参数的前面,看下面代码

1 #正确的做法
2 News.objects.get(
3     Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
4     question__startswith='Who')
5  
6 #错误的做法,代码将关键字参数放在了Q()对象的前面。
7 News.objects.get(
8     question__startswith='Who',
9     Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))

 

 
posted @ 2017-05-24 16:27  evil_liu  阅读(343)  评论(0)    收藏  举报