加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Django中Q查询及Q()对象

发布时间:2020-12-15 17:20:09 所属栏目:大数据 来源:网络整理
导读:div id="cnblogs_post_body" class="blogpost-body" 问题 一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,例如下面代码: >> q1 = Entry.objects.filter(headline__startswith= >> q2 = q1.exclude(pub_date__gte=datetime.date.today()) >>

<div id="cnblogs_post_body" class="blogpost-body">

问题

一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,例如下面代码:

>> q1 = Entry.objects.filter(headline__startswith=>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
>> q3 = q1.filter(pub_date__gte=datetime.date.today())

或者将其组合起来,例如:

>>q1 = Entry.objects.filter(headline_startswith="What").exclude(pub_date_gte=datetime.date.today())

随着我们的程序越来越复杂,查询的条件也跟着复杂起来,这样简单的通过一个filter()来进行查询的条件将导致我们的查询越来越长。

Q()对象就是为了将这些条件组合起来。

当我们在查询的条件中需要组合条件时(例如两个条件“且”或者“或”)时。我们可以使用Q()查询对象。例如下面的代码

这样就生成了一个Q()对象,我们可以。例如下面代码就将两个条件组合成了一个

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

我们可以在,例如下面代码:

对应SQL语句可以理解为:

这样我们

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

。如上面代码使用SQL语句理解将会是:

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

<span class="preprocessor">#错误的做法,代码将关键字参数放在了Q()对象的前面。
News.objects.<span class="keyword">get(
question__startswith=<span class="string">'Who',<span class="number">6)))

等方法中的关键字参数查询都是一起进行“AND” 的。 语句),你可以使用

() 对象用于封装一组关键字参数。

对象封装一个 查询:

对象可以使用 操作符组合起来。 对象上使用时,它产生一个新的 对象。

对象,表示两个 查询的“OR” :

子句:

操作符以及使用括号进行分组来编写任意复杂的 对象。 对象可以使用 操作符取反,这允许组合正常的查询和取反() 查询:

)都可以传递一个或多个 对象作为位置(不带名的)参数。 对象参数,这些参数的逻辑关系为“AND"。

和关键字参数。 对象)都将"AND”在一起。 对象,它必须位于所有关键字参数的前面。

的用法。

[python]



<p class="last">


<h3 id="传q对象构造搜索条件" style="margin: 10px 0px; padding: 0px; font-size: 16px; line-height: 1.5; font-family: Verdana,sans-serif;">传Q对象,构造搜索条件

<p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: Verdana,sans-serif; font-size: 13.3333px;">
首先还是需要导入模块:

 Q


q1.children.((,))
q1.children.((,))
q1.children.((,))

models.Tb1.objects.filter(q1)


<h4 id="合并条件进行查询" style="margin: 10px 0px; padding: 0px; font-size: 14px; font-family: Verdana,sans-serif;">合并条件进行查询:

q1 = Q()
q1.connector = <span class="hljs-string" style="margin: 0px; padding: 0px; color: #a31515;">'OR'
q1.children.<span class="hljs-built_in" style="margin: 0px; padding: 0px; color: #0000ff;">append((<span class="hljs-string" style="margin: 0px; padding: 0px; color: #a31515;">'id',<span class="hljs-number" style="margin: 0px; padding: 0px;">3))

q2 = Q()
q2.connector = <span class="hljs-string" style="margin: 0px; padding: 0px; color: #a31515;">'OR'
q2.children.<span class="hljs-built_in" style="margin: 0px; padding: 0px; color: #0000ff;">append((<span class="hljs-string" style="margin: 0px; padding: 0px; color: #a31515;">'status',<span class="hljs-string" style="margin: 0px; padding: 0px; color: #a31515;">'在线'))

con.add(q1,<span class="hljs-string" style="margin: 0px; padding: 0px; color: #a31515;">'AND')
con.add(q2,<span class="hljs-string" style="margin: 0px; padding: 0px; color: #a31515;">'AND')

models.Tb1.objects.filter(con)




<p class="last">

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读