ORM表查询之F查询和Q查询以及事务

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)
承蒙关照
原文地址:https://www.cnblogs.com/guanlei/p/11019797.html