F与Q查询
# 导入模块
from django.db.models import F,Q
数据准备:
F的功能:能够帮助直接获取到表中某个字段对应的数据,当做查询条件
查询卖出数大于库存数的书籍
res = models.Book.objects.filter(sold__gt=F('inventory'))
print(res)
# ]>
将所有书籍的价格提升50
models.Book.objects.update(price=F('price') + 50)
将所有书的名称后面增加爆款两个字
注意:在操作字符类型的数据时,F不能直接做到字符串的拼接,需要导入模块两个模块
from django.db.models.functions import Concat
from django.db.models import Value
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'),Value('爆款')))
Q查询:filter()等方法中的关键字参数查询都是一起进行'and',如果你需要执行更复杂的查询(列如ORM语句),可使用Q查询
- Q包裹逗号分隔,and 关系
- Q包裹 | 分隔,or 关系
- Q包裹 ~ 分隔,非 关系
# 导入模块
from django.db.models import F,Q
查询卖出数大于100或者价格小于600的书籍
res = models.Book.objects.filter(Q(sold__gt=100)|Q(price__lt=600))
print(res)
查询卖出数大于100和价格小于600的书籍
res = models.Book.objects.filter(Q(sold__gt=100),Q(price__lt=600))
print(res)
查询卖出数没有大于100和价格小于600的书籍
res = models.Book.objects.filter(~Q(sold__gt=100) , Q(price__lt=600))
print(res)
Q的高级用法:能够将查询条件的左边也变成字符串形式
# 先产生一个空对象 实列化
q = Q()
q.connector = 'or' # and修改成or
# q对象里面有一个children
q.children.append(('maichu__gt', 100))
# 第一个元素就会被当作查询条件的左边 第二个元素会被当作查询条件右边
q.children.append(('price__lt', 600))
res = models.Book.objects.filter(q) # filter 除了可以放条件 还可以放对象
print(res) # 默认还是and关系
1.可以在去对象内 children里面 无限制的添加元素 添加元组,两个元素。
2.而且还支持修改 or and not
3.默认是and
Django中如何开启事务
MySQL中的事务
事务:具有ACID四个特性
- A >>> 原子性
- C >>> 一致性
- I >>> 隔离性
- D >>> 持久型
事务的回滚:rollback
事务的确认:commit
Django中开启事务
首先需要导入模块
from django.db import transaction
完成句式:
from django.db import transaction
try:
with transaction.atomic():
# sql语句
# sql语句
# 在with代码块内书写的所有orm都属于同一个事务
except Exception as e:
print(e)
print('q其他操作')