【1】F查询
- 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?
- Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
示例1:
from django.db.models import F
ret1=models.Product.objects.filter(maichu__gt=F('kucun'))
print(ret1)
- F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量的条件了,实现了动态比较的效果
- Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。
- 将每个商品的价格提高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('新款')))
- Concat表示进行字符串的拼接操作
- 参数位置决定了拼接是在头部拼接还是尾部拼接
- Value里面是要新增的拼接值
【2】Q查询
filter()
等方法中逗号隔开的条件是与的关系。
- 如果你需要执行更复杂的查询(例如
OR
语句),你可以使用Q对象
。
示例1:
from django.db.models import Q
models.Product.objects.filter(Q(maichu__gt=100)|Q(price__lt=100))
- 对条件包裹一层Q时候,filter即可支持交叉并的比较符
示例2:
models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0))
- 我们可以组合
&
和|
操作符以及使用括号进行分组来编写任意复杂的Q
对象。 - 同时,
Q
对象可以使用~
操作符取反,这允许组合正常的查询和取反(NOT
) 查询。
示例3:
models.Product.objects.filter(Q(kucun__gt=60), name__contains="新款")
- 查询函数可以混合使用
Q 对象
和关键字参数。所有提供给查询函数的参数(关键字参数或Q
对象)都将"AND”在一起。但是,如果出现Q
对象,它必须位于所有关键字参数的前面。
事务
- 事务的定义:
- 将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性(NoSQL数据库对于事务则是部分支持)
# 事务
# 买一本 跟jason学Linux 书
# 在数据库层面要做的事儿
# 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)