zoukankan      html  css  js  c++  java
  • 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)
    承蒙关照
  • 相关阅读:
    django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
    Error fetching command 'collectstatic': You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path. Command 'collectstatic' skipped
    windows 虚拟环境下 安装 mysql 引擎一系列错误处理
    项目概念流程
    pip 使用
    HTTPserver v3.0 版本项目
    GitHub 使用
    git 操作命令详解
    git 忽略部分文件类型的同步
    Python 正则处理_re模块
  • 原文地址:https://www.cnblogs.com/guanlei/p/11019797.html
Copyright © 2011-2022 走看看