zoukankan      html  css  js  c++  java
  • F查询与Q查询事物及其他

    F查询

    F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量的条件了,实现了动态比较的效果

    Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。基于此可以对表中的数值类型进行数学运算

    from app01 import models
    
    # 查询卖出数大于50的商品
    res = models.Product.objects.filter(maichu__gt=50)
    print(res)
    # 查询卖出数大于库存数的商品
    
    from django.db.models import F,Q
    # F查询
    res = models.Product.objects.filter(maichu__gt=F('kucun'))
    print(res)
    # 将所有的商品的价格提高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('爆款')))
    

    Q查询

    # Q查询
     models.Product.objects.filter(price=188.88,name='连衣裙爆款')
    from django.db.models import F, Q
     # and
    models.Product.objects.filter(Q(price=188.88),Q(name='连衣裙爆款')) 
     # or
    models.Product.objects.filter(Q(price=188.88)|Q(name='连衣裙爆款')) 
     # not
    models.Product.objects.filter(Q(price=188.88)|~Q(name='连衣裙爆款')) 
    # 混合使用  需要注意的是Q对象必须放在普通的过滤条件前面
    models.Product.objects.filter(~Q(name='连衣裙爆款'),price=188.88) 
    
    
    

    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)
    
    # F(查询条件两端都是数据库数据)
    # 给书籍表增加卖出和库存字段
    	# 1.查询出卖出数大于库存数的商品
      # 2.将每个商品的价格提高50块
      
    # Q(filter里面条件都是与,Q支持与或非)
    	# 1.查询 卖出数大于100 或者 价格小于100块的
      # 2.查询 库存数是100 并且 卖出数不是0 的产品
      # 3.查询 产品名包含新款, 并且库存数大于60的
    

    事务

    # 事务的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')
    
    
    
    
    
    res = models.Product.objects.filter(id=1).first()
    print(res.gender)
    print(res.get_gender_display())  # 获取编号对应的中文注释
    models.Product.objects.create(...gender=1)
    

    only与defer

    拿到的是一个对象 两者是相反的

    res = models.Product.objects.values('name')
    # res 为QuerySet对象 列表中元素为套字典[{'name':xxx}]
    res = models.Product.objects.only('name')
    # res 为QuerySet对象 列表中元素为对象  该对象具有name属性 查询name时很快
    # 该对象也可以取到 Product其他属性字段 但是速度 相较name 慢很多
    res = models.Product.objects.defer('name')
    # res 为QuerySet对象 列表中元素为对象  该对象查询除了name属性之外的其他Product属性都快 唯独name较慢  与only相反
    
  • 相关阅读:
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
    UVA 11100 The Trip, 2007 (贪心)
    JXNU暑期选拔赛
    计蒜客---N的-2进制表示
    计蒜客---线段的总长
    计蒜客---最大质因数
    JustOj 2009: P1016 (dp)
  • 原文地址:https://www.cnblogs.com/9527mwz/p/11042550.html
Copyright © 2011-2022 走看看