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

相关文章
|
5月前
|
存储 数据库 开发者
Django Web架构:全面掌握Django模型字段(下)
Django Web架构:全面掌握Django模型字段(下)
80 2
|
5月前
|
存储 数据处理 数据库
Django Web架构:全面掌握Django模型字段(上)
Django Web架构:全面掌握Django模型字段(上)
66 0
|
缓存 数据库 Python
django这些查询技巧你会了吗?
django这些查询技巧你会了吗?
|
前端开发 数据库 Python
【Django】Django之ORM数据库查询及获取数据操作
【Django】Django之ORM数据库查询及获取数据操作
94 0
|
设计模式 开发框架 缓存
02-Django-基础篇-Django介绍
02-Django-基础篇-Django介绍
|
关系型数据库 MySQL Python
【一日一技】Django不定项数的“或查询”
【一日一技】Django不定项数的“或查询”
94 0
|
SQL 存储 缓存
Django 模型查询2.3
Django 模型查询2.3
125 0
Django—— F、Q查询
Django—— F、Q查询
|
Python 存储
Django日志
logging模块 Django的日志使用了python的logging模块,需要在settings中进行配置logging模块由四部分组成 记录器 记录器配置具有日志级别。此日志级别描述了记录器将处理的消息的严重性。
|
Web App开发 安全 测试技术
Django 2.1.3文档
关于Django你需要知道的一切。 获得帮助 遇到麻烦?我们想帮忙! 尝试常见问题解答 - 它可以解答许多常见问题。 寻找具体信息?尝试索引,模块索引或详细目录。 在django-users邮件列表的档案中搜索信息,或 发布问题。
2297 0

热门文章

最新文章

下一篇
开通oss服务