Django ORM 之F、Q查询与事务
返回ORM目录 Django ORM
内容目录
一、F、Q查询
二、事务
三、only与defer
一、F、Q查询
"""
Product表中的数据:
1 橡皮 2 2000 3000
2 铅笔 3 12 200
3 华为保时捷 18000 30 23
4 索尼A6000 3680 24 12
"""
# 查询卖出数大于50的商品
# res = models.Product.objects.filter(maichu__gt=50)
# <QuerySet [<Product: 商品对象的名字:橡皮>]>
1. F查询
当想让两个字段进行比较的时候,就需要Django的F()来实现。 (1)先导入F、Q
from django.db.models import F,Q (2)查询卖出数大于库存数的商品
res = models.Product.objects.filter(maichu__gt=F('kucun'))
# <QuerySet [<Product: 商品对象的名字:华为保时捷>, <Product: 商品对象的名字:索尼A6000>]> (3)将所有的商品的价格提高100块
models.Product.objects.update(price=F('price')+100)
"""
修改完价格之后的表数据:
1 橡皮 102 2000 3000
2 铅笔 103 12 200
3 华为保时捷 18100 30 23
4 索尼A6000 3780 24 12
""" (4)将所有商品的名字后面都加上:'特供'
from django.db.models.functions import Concat
from django.db.models import Value
models.Product.objects.update(name=Concat(F('name'), Value('特供'))) 解释:单纯的使用 name=F('price')+'特供' 是行不通的,还得
"""
修改之后的数据:
1 橡皮特供 102 2000 3000
2 铅笔特供 103 12 200
3 华为保时捷特供 18100 30 23
4 索尼A6000特供 3780 24 12
"""
2. Q查询
(1)res = models.Product.objects.filter(price=102)
# <QuerySet [<Product: 商品对象的名字:橡皮特供>]> (2)res = models.Product.objects.filter(Q(price=103), Q(name='橡皮特供')) # and
# <QuerySet []> (3)res = models.Product.objects.filter(Q(price=103) | Q(name='橡皮特供')) # or
# <QuerySet [<Product: 商品对象的名字:橡皮特供>, <Product: 商品对象的名字:铅笔特供>]> (4)二者混合使用 需要注意的是Q对象必须放在普通的过滤条件前面
res = models.Product.objects.filter(~Q(name='橡皮特供'), price=103)
# <QuerySet [<Product: 商品对象的名字:铅笔特供>]> 非橡皮特供,且价格为103的商品 # 当要查询的条件是用户输入进来的时候,可以动态的添加
q = Q()
q.connector = 'or' # 通过这个参数可以将Q对象默认的and关系变成or
q.children.append(('price', 102))
q.children.append(('name', '橡皮特供'))
res = models.Product.objects.filter(q) # Q对象查询默认也是and
# <QuerySet [<Product: 商品对象的名字:橡皮特供>]>
二、事务
(1)事务的ACID
"""
原子性
一致性
隔离性
持久性
"""
(2) 代码实现:
from django.db import transaction
from django.db.models import F
with transaction.atomic():
# 在with代码块儿写你的事务操作
models.Product.objects.filter(id=1).update(kucun=F('kucun')-1)
models.Product.objects.filter(id=1).update(maichu=F('maichu')+1)
# 写其他代码逻辑
三、only与defer
1.作为参照的例子
res = models.Product.objects.values('name')
<QuerySet [{'name': '橡皮特供'}, {'name': '铅笔特供'}, {'name': '华为保时捷特供'}, {'name': '索尼A6000特供'}]> 2.only和defer,查询拿到的都是对象,但是两者是相反的 res = models.Product.objects.only('name')
res = models.Product.objects.defer('name')
for i in res:
print(i.name) (1)从执行结果来看,都会出现下面的查询结果,区别在于,only 执行的SQL语句,只会将指定字段的数据取出来,defer则是取出除指定的字段的其他所有数据,
(2)但是呢,取出的对象,还是可以点出相应字段的属性,他是会去执行相应的SQL语句,再次去数据库中查询数据。
(3)上面代码执行的结果如下(结果相同):
# <QuerySet [<Product: 商品对象的名字:橡皮特供>, <Product: 商品对象的名字:铅笔特供>, <Product: 商品对象的名字:华为保时捷特供>, <Product: 商品对象的名字:索尼A6000特供>]>
Django ORM 之F、Q查询与事务的更多相关文章
- Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)
Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...
- ORM之自关联、add、set方法、聚合函数、F、Q查询和事务
一.外键自关联(一对多) 1.建表 # 评论表 class Comment(models.Model): id = models.AutoField(primary_key=True) content ...
- Django ORM (四) annotate,F,Q 查询
annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合. from django.shortcuts import re ...
- Django框架08 /聚合查询、分组、F/Q查询、原生sql相关
Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 目录 Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 1. 聚合查询 2. 分组 3. F查询和Q查询 4. o ...
- Django day08 多表操作 (五) 聚合,分组查询 和 F,Q查询
一:聚合,分组查询 二:F, Q查询
- 数据库开发-Django ORM的单表查询
数据库开发-Django ORM的单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询集 1>.查询集相关概述 查询会返回结果的集,它是django.db.mod ...
- 数据库开发-Django ORM的多对多查询
数据库开发-Django ORM的多对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...
- 数据库开发-Django ORM的一对多查询
数据库开发-Django ORM的一对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
随机推荐
- Java缓冲区读写
缓冲区读 有两种方法从缓冲区读取数据: 绝对位置 相对位置 使用四个版本重载的get()方法用于从缓冲区读取数据. get(int index)返回给定索引处的数据. get()从缓冲区中的当前位置返 ...
- Java性能调优攻略全分享,5步搞定!(附超全技能图谱)
对于很多研发人员来说,Java 性能调优都是很头疼的问题,为什么这么说?如今,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优 ...
- Java-向上转型后调用方法和属性的注意事项
/*多态的注意事项 (1)如果子类重写了父类方法, 意味着子类里定义的方法彻底覆盖了父类里同名的方法, 系统将不可能把父类里的方法转移到子类中 补充对(1)的个人理解: 当s向上转型传给了b, b即使 ...
- libevent使用IOCP网络模型的示例
这段时间抽空学习了一下强大的网络库libevent,其使用标准C语言编写,支持Windows.Linux.Mac等等主流操作系统,早期版本不支持Windows的IOCP,最新版本已经添加上了,在网上找 ...
- margin与padding
1.不加内边距的div: <div style="width:150px; height:150px; "> <div style="width: ...
- BCZM : 1.15
数独 解法一:广度优先搜索. 解法二:先填满中间矩阵,其他区域通过矩阵置换求出.
- shell脚本将命令的结果赋值给变量的2种写法
Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式: variable=`command`variable=$(command) 第一种方式把命令用反引号` `(位于 Esc 键的下方 ...
- Codeforces Round #563 (Div. 2) E. Ehab and the Expected GCD Problem
https://codeforces.com/contest/1174/problem/E dp 好题 *(if 满足条件) 满足条件 *1 不满足条件 *0 ///这代码虽然写着方便,但是常数有点大 ...
- 【Codeforces Round #429 (Div. 2) B】 Godsend
[Link]:http://codeforces.com/contest/841/problem/B [Description] 两个人轮流对一个数组玩游戏,第一个人可以把连续的一段为奇数的拿走,第二 ...
- Python 爬取拉钩网工作岗位
如果拉钩网html页面做了调整,需要重新调整代码 代码如下 #/usr/bin/env python3 #coding:utf-8 import sys import json import requ ...