Django F与Q查询以及如何开启事务

F与Q查询

# 导入模块
from django.db.models import F,Q

数据准备:

Django F与Q查询以及如何开启事务_第1张图片

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关系

Django F与Q查询以及如何开启事务_第2张图片

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其他操作')

你可能感兴趣的:(django,python,后端,开发语言)