Django中Q查询及Q()对象

前端之家收集整理的这篇文章主要介绍了Django中Q查询及Q()对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<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()对象,我们可以函数自动生成一个新的Q()。例如下面代码就将两个条件组合成了一个

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

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

对应sql语句可以理解为:

这样我们查询逻辑。

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

自动理解成“且(and)”关系。如上面代码使用sql语句理解将会是:

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” :

sql 子句:

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

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

sql:

查询函数可以混合使用和关键字参数。查询函数的参数(关键字参数或 对象)都将"AND”在一起。 对象,它必须位于所有关键字参数的前面。

查询,等同于前面的例子;

查询示例演示了几种用法

Highlighter bg_python" style="padding: 1px 0px 0px; font-family: Consolas,'Courier New',Courier,mono,serif; font-size: 12px; background-color: #e7e5dc; width: 772.188px; overflow-x: auto; overflow-y: hidden; position: relative; color: #454545; margin: 18px 0px!important;">
[python]
    @H_393_404@
  1. @H_393_404@
  2. @H_393_404@
  3. @H_393_404@
  4. @H_393_404@
  5. @H_393_404@
  6. @H_393_404@
  7. @H_393_404@
  8. @H_393_404@
  9. @H_393_404@
  10. @H_393_404@
  11. @H_393_404@
  12. @H_393_404@
  13. @H_393_404@
  14. @H_393_404@
  15. @H_393_404@
  16. @H_393_404@
  17. @H_393_404@
  18. @H_393_404@
  19. @H_393_404@
  20. @H_393_404@
  21. @H_393_404@
  22. @H_393_404@
  23. @H_393_404@
  24. @H_393_404@
  25. @H_393_404@
  26. @H_393_404@
  27. @H_393_404@
  28. @H_393_404@
  29. @H_393_404@
  30. @H_393_404@
  31. @H_393_404@
  32. @H_393_404@
  33. @H_393_404@



<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

查询" style="margin: 10px 0px; padding: 0px; font-size: 14px; font-family: Verdana,sans-serif;">传入条件进行查询:


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">

猜你在找的Django相关文章