🌈🌈🌈🌈不定时的更新叒叕开始了,且更且珍惜🌈🌈🌈🌈
我要每次都写一遍:前面的还没补完,以此催促不定时更新的我
⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅
F查询和Q查询
🔎F查询
# 查询卖出数大于50的商品 res = models.Product.objects.filter(maichu__gt=50) print(res)
在前面的例子👆中,都只是将字段值与某个自己设定的常量做比较。
如果我们要对两个字段的值做比较,那该怎么做呢?
Django 提供 F() 来做这样的比较。
F() 的实例可以在查询中引用字段,
来比较同一个 model 实例中两个不同字段的值。
F查询的使用:
Django 支持 F() 对象之间以及 F() 对象和常数之间的
加减乘除和取模的操作。
基于此可以对表中的数值类型进行数学运算
# 查询卖出数大于库存数的商品 from django.db.models import F # 先导入 res = models.Product.objects.filter(maichu__gt=F('kucun')) print(res) # 将所有的商品的价格提高100块 models.Product.objects.update(price=F('price')+100)
F查询的优点:
实现了动态比较的效果,
F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,
而不是我自己自定义常量的条件了
注:当我们想修改char字段,可能你也会想要按照上面对数值类型的操作
恭喜,你按照上面写完一运行,结果立马报错
这就需要用到对字符串进行拼接Concat操作,
并且要加上拼接值Value
如👇:
# 将所有商品的名字后面都加一个爆款 from django.db.models.functions import Concat from django.db.models import Value models.Product.objects.update(name=Concat(F('name'),Value('爆款')))
注:
Concat表示进行字符串的拼接操作,
参数位置决定了拼接是在头部拼接还是尾部拼接,
Value里面是要新增的拼接值
🔎Q查询
我们用filter() 等方法中逗号隔开的条件是与的关系,
如果想变成or的关系应该咋办呢?
这就需要用到Q对象了
res = models.Product.objects.filter(price=188.88,name='连衣裙爆款') print(res) from django.db.models import Q
# 我们可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。
# 同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。
res = models.Product.objects.filter(Q(price=188.88),Q(name='连衣裙爆款')) # and res = models.Product.objects.filter(Q(price=188.88)|Q(name='连衣裙爆款')) # or res = models.Product.objects.filter(Q(price=188.88)|~Q(name='连衣裙爆款')) # not #混合使用 需要注意的是Q对象必须放在普通的过滤条件前面 res = models.Product.objects.filter(~Q(name='连衣裙爆款'),price=188.88) # not print(res)
注:混合使用时Q对象必须放在普通的过滤条件前面
Q对象补充(*******):
from django.db.models import F, Q q = Q() q.connector = 'or' # 通过这个参数可以将Q对象默认的and关系变成or # 当字段为字符串的时候要使用这种方式 q.children.append(('price',188.88)) q.children.append(('name','高跟鞋爆款')) res = models.Product.objects.filter(q) # Q对象查询默认也是and print(res)
事务
定义:将多个sql语句操作变成原子性操作,要么同时成功,
有一个失败则里面回滚到原来的状态,
保证数据的完整性和一致性(NoSQL数据库对于事务则是部分支持)
四大特性(ACID):
原子性
一致性
隔离性
持久性
使用:
from django.db import transaction from django.db.models import F with transaction.atomic(): # 在with代码块儿写你的事务操作 models.Product.objects.filter(id=1).update(kucun=F('kucun')-1) models.Product.objects.filter(id=1).update(maichu=F('maichu')+1) # 写其他代码逻辑 print('hahah')
only与defer
# 拿到的是一个对象 两者是相反的 res = models.Product.objects.values('name') res = models.Product.objects.only('name') res = models.Product.objects.defer('name') for i in res: print(i.name)
补充:choices字段
我们在数据库中存的一些数据实际上是用数字标识的,
比如性别,当我们想查看某个对象的性别时,
如果我们直接对象.字段名只能获取到数字,
要是想看具体的中文注释该如何操作??
请看👇👇
res = models.Product.objects.filter(id=1).first() print(res.gender) print(res.get_gender_display()) # 获取编号对应的中文注释 # models.Product.objects.create(...gender=1)
为什么要用数字来对应,而不是直接从文字?
因为编号占的空间更小,更方便我们去管理。
难得当天整理完博客🌚🌚🌚🌚🌚