Django之F和Q查询

简介:

 当一般的查询语句已经无法满足我们的需求时,Django为我们提供了F和Q复杂查询语句。假设场景一:老板说对数据库中所有的商品,在原价格的基础上涨价10元,你该怎么做?场景二:我要查询一个名字叫xxx,年龄是18岁,或者名字是yyy,年龄是是19岁的人,你该怎么写你的ORM语句?


一、F查询   

1
2
3
4
from  django.db.models  import  F
from  app01.models  import  Book
 
Book.objects.update(price = F( "price" ) + 20 )   # 对于book表中每本书的价格都在原价格的基础上增加20元

    就这样一条简单的语句就完成了对表中所有商品价格的更新,是不是很方便!如果没有F查询,你首先要获取原价格,再做一个算术运算,然后更新字段。F查询专门对对象中某列值的操作,不可使用__双下划线!


二、Q查询

    Q查询可以组合使用 “&”, “|” 操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象,Q对象可以用 “~” 操作符放在前面表示否定,也可允许否定与不否定形式的组合。Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。

1
2
3
4
5
6
7
from  django.db.models  import  Q
 
print (Book.objects. filter (Q( id = 3 ))[ 0 ])   # 因为获取的结果是一个QuerySet,所以使用下标的方式获取结果
print (Book.objects. filter (Q( id = 3 )|Q(title = "Go" ))[ 0 ])   # 查询id=3或者标题是“Go”的书
print (Book.objects. filter (Q(price__gte = 70 )&Q(title__startswith = "J" )))   # 查询价格大于等于70并且标题是“J”开头的书
print (Book.objects. filter (Q(title__startswith = "J" ) & ~Q( id = 3 )))   # 查询标题是“J”开头并且id不是3的书
print (Book.objects. filter (Q(price = 70 )|Q(title = "Python" ), publication_date = "2017-09-26" ))   # Q对象可以与关键字参数查询一起使用,必须把普通关键字查询放到Q对象查询的后面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from  django.db.models  import  Q
 
con  =  Q()
q1  =  Q()
q1.connector  =  "AND"
q1.children.append(( "email" "123@qq.com" ))
q1.children.append(( "password" "abc123" ))
 
q2  =  Q()
q2.connector  =  "AND"
q2.children.append(( "username" "abc" ))
q2.children.append(( "password" "xyz123" ))
 
con.add(q1,  "OR" )
con.add(q2,  "OR" )
 
obj  =  models.UserInfo.objects. filter (con).first()
 
# 查询email=123@qq.com和password=abc123 或者 username=abc和password=xyz123的用户信息

    上面的例子就是一个典型的复杂查询,通过将Q对象实例化来然后增加各个条件之间的关系,而且这种写法用在你不知道用户到底会传入多少个参数的时候很方便!

本文转自戴柏阳的博客博客51CTO博客,原文链接http://blog.51cto.com/daibaiyang119/2046959如需转载请自行联系原作者


daibaiyang119

相关文章
|
3月前
|
存储 数据库 开发者
Django Web架构:全面掌握Django模型字段(下)
Django Web架构:全面掌握Django模型字段(下)
58 2
|
缓存 数据库 Python
django这些查询技巧你会了吗?
django这些查询技巧你会了吗?
|
前端开发 JavaScript Python
django -- 安装django
django -- 安装django
|
设计模式 开发框架 缓存
02-Django-基础篇-Django介绍
02-Django-基础篇-Django介绍
|
关系型数据库 MySQL Python
【一日一技】Django不定项数的“或查询”
【一日一技】Django不定项数的“或查询”
86 0
|
SQL 存储 缓存
Django 模型查询2.3
Django 模型查询2.3
122 0
Django—— F、Q查询
Django—— F、Q查询
|
Web App开发 安全 测试技术
Django 2.1.3文档
关于Django你需要知道的一切。 获得帮助 遇到麻烦?我们想帮忙! 尝试常见问题解答 - 它可以解答许多常见问题。 寻找具体信息?尝试索引,模块索引或详细目录。 在django-users邮件列表的档案中搜索信息,或 发布问题。
2293 0
|
安全 程序员 测试技术
Django 1.8.2 文档
django 百科全书 入门¶刚开始学习Django或者编程?让我们从这里开始吧! 从零开始: 概述 | 安装 教程: 第1部分:模型(100%) | 第2部分:管理站点(100%) | 第3部分:视图和模板 | 第4部分:表单和通用视图(100%) | 第5部分:测试(100%) | 第6部分:静态文件(100%) 高级教程: 如何编写可重用的应用(100%) | 编写Django的第一个补丁(100%) 模型层¶ Django提供了一个抽象层(“模型”),用于构造和操纵Web应用程序的数据。
5731 0
|
Python 安全
Django配置介绍
Django的配置文件settings.py包含了基本上所有的Django安装的配置,这里解释下配置是如何生效的,还有有哪些可用的配置。 基础 配置文件是一个Python的模块,然后里面有一些模块级的变量。