F查询
在django中查询时都是已知数据的字段来进行查询,如果是按照两个字段来进行查询呢?
例如在一个商品表里,我们需要知道库存大于售出的商品,这时候库存和售出的数据均没有实际的值,
这时候就需要我们引入F来帮助我们解决问题。
在models.py文件里
class Product(models.Model): name = models.CharField(max_length=32) # 都是类实例化出来的对象 price = models.DecimalField(max_digits=8,decimal_places=2) maichu = models.IntegerField() kucun = models.IntegerField() info = MyCharField(max_length=32,null=True) # 改字段可以为空 choices = ((1,'男'),(2,'女'),(3,'其他')) gender = models.IntegerField(choices=choices,default=2) def __str__(self): return '商品对象的名字:%s'%self.name
在测试文件里写出如下代码就可以找到
from django.db.models import F,Q res = models.Product.objects.filter(maichu__gt=F('kucun'))
#将所有的商品的价格提高100块 models.Product.objects.update(price=F('price')+100) 将所有商品的名字后面都加一个爆款 from django.db.models.functions import Concat from django.db.models import Value models.Product.objects.update(name=Concat(F('name'),Value('爆款')))
F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量的条件了,实现了动态比较的效果
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。
Concat表示进行字符串的拼接操作,参数位置决定了拼接是在头部拼接还是尾部拼接,Value里面是要新增的拼接值
Q查询
filter() 等方法中逗号隔开的条件是and的关系。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q查询。
from django.db.models import F, Q res = models.Product.objects.filter(price=188.88,name='连衣裙爆款') 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
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)
查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。
事务
事务的定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据库数据的完整性和一致性。
事务的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)