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 ...
随机推荐
- 8.1 图像API
8.1 图像API Routine Description Drawing related functions GUI_AddRect() 调整矩形框的大小 GUI_GetClientRect() R ...
- Linux Kernel Development有关内存管理
1 Pages Page的概念来源为处理器Processor的部件MMU(Memory Management Unit),MMU通过设置好的页表(通过设置CR3寄存器,指向页目录所在的物理内存)对内存 ...
- 剑指offer第二版面试题3:二维数组中的查找(JAVA版)
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 1 2 8 9 2 4 ...
- PAT_A1024#Palindromic Number
Source: PAT A1024 Palindromic Number (25 分) Description: A number that will be the same when it is w ...
- (转载)js调用打印机 打印整体或部分
本文转载自:https://www.cnblogs.com/lfhy/p/6802781.html 以下为原文内容: 有时前端的项目中需要添加打印的功能,首先要知道打印分为整体打印和局部打印两种,而局 ...
- Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境
目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...
- 49-Ubuntu-其他命令-1-文件软链接
序号 命令 作用 01 ln -s 被链接的原文件 链接文件 建立文件的软链接,用通俗的方式讲类似于Windows下的快捷方式 注意: 没有-s选项建立的是一个硬链接文件--->>两个文件 ...
- 2018年初面试Java(1.5年经验)
xml文档如何解析 控制反转如何实现 http://www.cnblogs.com/qf123/p/8602972.html struts2和springmvc的区别 http://www.cnblo ...
- sql ibatis
<!-- 写入单位下当前参保人员 --> <insert id="insertTempCaz043" parameterClass="map" ...
- 22-5-join
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...