🌈🌈🌈🌈不定时的更新叒叕开始了,且更且珍惜🌈🌈🌈🌈

我要每次都写一遍:前面的还没补完,以此催促不定时更新的我
⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅

 

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查询的优点:

        实现了动态比较的效果,

        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)

     为什么要用数字来对应,而不是直接从文字?

    因为编号占的空间更小,更方便我们去管理。

 

难得当天整理完博客🌚🌚🌚🌚🌚