django F查询与Q查询、事务

目录:

  1. F查询
  2. Q查询
  3. 事务

F查询

当要对两个字段的值做比较,可以使用Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

示例1:

# 查询出卖出数大于库存数的商品

from django.db.models import F
ret1=models.Product.objects.filter(maichu__gt=F('kucun'))
print(ret1)

# F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量

示例2:

# 将每个商品的价格提高50块

models.Product.objects.update(price=F('price')+50)

# 注:只能对数字类型这样操作

# 当要修改char字段

#例如:把所有书名后面加上'新款',(这个时候需要对字符串进行拼接Concat操作,并且要加上拼接值Value)

from django.db.models.functions import Concat
from django.db.models import Value
ret3=models.Product.objects.update(name=Concat(F('name'),Value('新款')))

# 注:当需要将新款放在书名之前,先将参数的位置更换

回到目录



Q查询

filter() 等方法中逗号隔开的条件是与的关系。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q查询。

示例1:

# 查询 卖出数大于100 或者 价格小于100块的

from django.db.models import Q
models.Product.objects.filter(Q(maichu__gt=100)|Q(price__lt=100))
对条件包裹一层Q时候,filter即可支持交叉并的比较符

示例2:

# 查询 库存数是100 并且 卖出数不是0 的产品

models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0))
#我们可以组合& 和|  操作符以及使用括号进行分组来编写任意复杂的Q 对象。

# 同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。

示例3:

# 查询产品名包含新款, 并且库存数大于60的

models.Product.objects.filter(Q(kucun__gt=60), name__contains="新款")
# 注:查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。

回到目录



事务

将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性(NoSQL数据库对于事务则是部分支持)
事务(ACID)
A:原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
C:一致性(Consistency)事务前后数据的完整性必须保持一致。
I:隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
D:持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

示例1:

# 1. 创建一条订单数据
# 2. 去产品表 将卖出数+1, 库存数-1
from django.db.models import F
from django.db import transaction
# 开启事务处理
try:
	with transaction.atomic():
		# 创建一条订单数据
		models.Order.objects.create(num="110110111", product_id=1, count=1)
		# 能执行成功
		models.Product.objects.filter(id=1).update(kucun=F("kucun")-1, maichu=F("maichu")+1)
except Exception as e:
	print(e)

回到目录

你可能感兴趣的:(python,django)