zoukankan      html  css  js  c++  java
  • F查询与Q查询

    F查询

    在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?

    Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

    示例1:

    查询出卖出数大于库存数的商品

    from django.db.models import F
    ret1=models.Product.objects.filter(maichu__gt=F('kucun'))
    print(ret1)
    

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

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

    将每个商品的价格提高50块

    models.Product.objects.update(price=F('price')+50)
    

    引申:

    如果要修改char字段咋办(千万不能用上面对数值类型的操作!!!)?

    如:把所有书名后面加上'新款',(这个时候需要对字符串进行拼接Concat操作,并且要加上拼接值Value)

    from django.db.models.functions import Concat
    from django.db.models import Value
    ret3=models.Product.objects.update(name=Concat(F('name'),Value('新款')))
    

    Concat表示进行字符串的拼接操作,参数位置决定了拼接是在头部拼接还是尾部拼接,Value里面是要新增的拼接值

    Q查询

    filter() 等方法中逗号隔开的条件是与的关系。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象

    示例1:

    查询 卖出数大于100 或者 价格小于100块的

    from django.db.models import Q
    models.Product.objects.filter(Q(maichu__gt=100)|Q(price__lt=100))
    

    对条件包裹一层Q时候,filter即可支持交叉并的比较符

    示例2:

    查询 库存数是100 并且 卖出数不是0 的产品

    models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0))
    

    我们可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。

    同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。

    示例3:

    查询产品名包含新款, 并且库存数大于60的

    models.Product.objects.filter(Q(kucun__gt=60), name__contains="新款")
    

    查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。

  • 相关阅读:
    k3 cloud套打模板中出现单元格数据为空的情况,及无法正确的选择数据源
    k3 cloud中列表字段汇总类型中设置了汇总以后没有显示出汇总值
    k3 cloud查看附件提示授予目录NetWorkService读写权限
    k3 cloud中提示总账期末结账提示过滤条件太长,请修改此过滤条件
    金蝶云k3 cloud采购入库单校验日期不通过
    C# Code First 配置(二)
    C# Azure 远程调试
    C# ABP源码详解 之 BackgroundJob,后台工作(一)
    C# 在webapi项目中配置Swagger(最新版2017)
    高并发之
  • 原文地址:https://www.cnblogs.com/aden668/p/11739043.html
Copyright © 2011-2022 走看看