python3开发进阶-Django框架中的ORM的常用操作的补充(F查询和Q查询,事务)
阅读目录
一、F查询和Q查询
1、F查询
查询前的准备
class Product(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=10, decimal_places=2) # 库存数
inventory = models.IntegerField()
# 卖出数
sale = models.IntegerField() def __str__(self):
return "{}:{}:{}:{}".format(self.name, self.price, self.inventory, self.sale)
app下的models
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (1, '跟大娃变大', 239, 1000, 10);
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (2, '跟二娃学吹牛逼', 20150, 60, 60);
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (3, '跟三娃学喊麦', 50150, 100, 0);
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (4, '跟四娃学诗歌', 159, 50, 10000);
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (5, '跟五娃学树新风', 155, 100, 200);
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (6, '跟六娃学喷口水', 152, 200, 1);
SQL数据名称:main_app01_product
在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?
Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
示例1:
查询卖出数大于库存数的商品
from django.db.models import F
models.Product.objects.filter(sale__gt=F('inventory'))
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。
models.Product.objects.filter(sale__lt=F('sale')*2)
修改操作也可以使用F函数,比如将每一本书的价格提高30元
models.Product.objects.update(price=F("price")+30)
注意:update修改字段和对象,属性修改字段的区别:
1、对象.属性方法会更新所有字段
2、update方法只会更新你修改的那个字段
引申:
如果要修改char字段咋办?
如:把所有书名后面加上(第一版)
from django.db.models.functions import Concat
from django.db.models import Value
models.Product.objects.update(title=Concat(F("title"), Value("("), Value("第一版"), Value(")")))
2、Q查询
1、多个查询条件做 交集 并集 取反操作时
2、如果Q查询和关键字查询同时存在时,Q查询要放在关键字查询的前面
filter() 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。
示例1:
查询卖出数大于100或者价格小于100
models.Product.objects.filter(Q(sale__gt=100)|Q(sale__lt=100))
你可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。
示例:查询库存数是100 并且 卖出数不是0 的商品
models.Product.objects.filter(Q(inventory=100) & ~Q(sale=0))
查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。
例如:查询商品名包含喷口水,并且库存数大于60
models.Product.objects.filter(Q(inventory__gt=60), name__icontains="喷口水")
二、事务
1、什么是事务?
数据的原子性、隔离性、持久性、一致性
class Product(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=10, decimal_places=2) # 库存数
inventory = models.IntegerField()
# 卖出数
sale= models.IntegerField() def __str__(self):
return "{}:{}:{}:{}".format(self.name, self.price, self.inventory, self.sale) class Order(models.Model):
num = models.CharField(max_length=64)
product = models.ForeignKey(to="Product")
count = models.IntegerField()
models中的类
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (1, '跟大娃变大', 239, 1000, 10);
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (2, '跟二娃学吹牛逼', 20150, 60, 60);
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (3, '跟三娃学喊麦', 50150, 100, 0);
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (4, '跟四娃学诗歌', 159, 50, 10000);
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (5, '跟五娃学树新风', 155, 100, 200);
INSERT INTO app01_product (id, name, price, inventory, sale) VALUES (6, '跟六娃学喷口水', 152, 200, 1);
SQL数据main_app01_product
import os if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
import django
django.setup() import datetime
from app01 import models try:
from django.db.models import F
from django.db import transaction
#买一本书
#在数据库层面要做到的事儿
#1、创建一条订单数据
#2、去产品表 将卖出数+1,库存数-1
with transaction.atomic(): #开启事务处理
#创建一条订单数据
models.Order.objects.create(num='123456789',product_id=1,count=1)
#去产品表 将卖出数+1,库存数-1(报错)
models.Product.objects.get(id=1).update(inventory=F('inventory')-1,sale=F('sale')+1)
#能执行成功
#models.Product.objects.filter(id=1).update(inventory=F('inventory'-1,sale=F('sale')+1))
except Exception as e:
print(e)
# 不开启事务
# try:
# # 创建一条订单数据
# models.Order.objects.create(num="123456789", product_id=1, count=1)
# # 去产品表 将卖出数+1, 库存数-1
# models.Product.objects.get(id=1).update(kucun=F("kucun") - 1, maichu=F("maichu") + 1)
# except Exception as e:
# print(e)
python3开发进阶-Django框架中的ORM的常用操作的补充(F查询和Q查询,事务)的更多相关文章
- python3开发进阶-Django框架中的ORM的常用(增,删,改,查)操作
阅读目录 如何在Django终端打印SQL语句 如何在Python脚本中调用Django环境 操作方法 单表查询之神奇的下划线 ForeignKey操作 ManyToManyField 聚合查询和分组 ...
- python3开发进阶-Django框架中form的查看校验方法is_valid()的源码,自定义验证方法
form表单的校验方法is_valid() 点开我们发现这个函数里面只有两个方法方法,最终返回True or False 我们点进.is_bound属性,里面判断传输的数据不是空和上传文件不是空 点进 ...
- python3开发进阶-Django框架的详解
一.MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分: 模型(Model).视图(View)和控制器(Con ...
- python3开发进阶-Django框架的起飞加速一(ORM)
阅读目录 ORM介绍 Django中的ORM ORM中的Model ORM的操作 一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一 ...
- python3开发进阶-Django框架的中间件的五种用法和逻辑过程
阅读目录 什么是中间件 中间件的执行流程 中间件的逻辑过程 一.什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围 ...
- python3开发进阶-Django框架的ORM常用字段和参数
阅读目录 常用字段 字段合集 自定义字段 字段参数 关系参数 多对多的关联关系的三种方式 一.常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中 ...
- python3开发进阶-Django框架的自带认证功能auth模块和User对象的基本操作
阅读目录 auth模块 User对象 认证进阶 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其 ...
- python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)
''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_ ...
- python3开发进阶-Django框架的Form表单系统和基本操作
阅读目录 什么是Form组件 常用字段和插件 自定义校验的方式 补充进阶 一.什么是Form组件 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标 ...
随机推荐
- HDU 多校对抗赛 D Distinct Values
Distinct Values Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 自旋锁、排队自旋锁、MCS锁、CLH锁
转载自:http://coderbee.net/index.php/concurrent/20131115/577 自旋锁(Spin lock) 自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他 ...
- Win7/8 绿色软件开机启动
在查找番茄工作法PC端软件时,发现了淡高的文章win8绿色软件开机启动,试用了一下wintabs,的确好用! 另外,office软件中有一款 OFFICE tabs的插件,标签式的管理,非常方便快捷, ...
- jquery中lhgdialog插件(一)
一:前言 最近在使用jquery的控件,其实以前也写但是突然之间遇到了需要从弹出窗口传值到父窗口,突然觉得这种传值的方式其实也是需要javascript的基础的,但是我自己还没有去真正的做过,所以还是 ...
- HDU1869---(最短路+floyd)
http://acm.hdu.edu.cn/showproblem.php?pid=1869 思路:最短路+floyd 分析:1 题目是要求所有的数据能否满足“六度分离”,那么我们就想到所有点之间的最 ...
- 如何让 linux unzip 命令 不输出结果
unzip xx.zip > /dev/null 2>&1 unzip xx.zip > /dev/null前半部分是将标准输出重定向到空设备, 后面的2>&1 ...
- Android源码的BUG
在Android系统移植过程中,遇到很多源码上的BUG.但是我们看到市面上都是没有这些问题的.难道这些BUG在每个开发商都要经历一次解BUG的过程吗?Android释放的源码是否是最新的?暂时没有想法 ...
- EasyUI的tree展开所有的节点或者根据特殊的条件控制展示指定的节点
展示tree下的所有节点$(function(){ $('#t_funinfo_tree').tree({ checkbox: true, url:"<%=basePath %> ...
- sql 获取字符串首字母,循环
//字符串首字母 CREATE FUNCTION GetInitialLetter(@ChineseString NVARCHAR()) RETURNS NVARCHAR() AS BEGIN DEC ...
- 《Java编程思想》笔记 第三章 操作符
1.操作符种类: 运算顺序1-7 一元操作符(单目操作符) - 负号, + 正号,--递减,++递增 算术操作符 + - * / % 移位操作符 <<左移(低位补0),>&g ...