• Python数据库查询之组合条件查询-F&Q查询


    F查询(取字段的值)

    关于查询我们知道有filter( ) ,values( ) , get( ) ,exclude( ) ,如果是聚合分组,还会用到aggregate和annotate,甚至还有万能的双下划线,但是如果有这样一个需求,查询a表中的aa字段数值大于a表中bb字段数值,应该怎么做呢,Django提供一个F表达式来支持这种操作

    首先应该导入模块: 

    from django.db.models import F
    a.objects.filter(aa__gt=F('bb'))

    再举一个简单的例子,修改表中的值,为每一个a表中的price字段的值,加20

    a.objects.all().update(price=F('price')+20)

    如果没有F 对象,这种需求是无法实现的

    Django支持对F()对象进行加、减、乘、除、取模、幂计算等操作

    F()括号中还支持双下划线进行连表查询,F()返回的结果不一定是数字,也可以是字符串,比如,a和b是两张表

    from django.db.models import F
    a.objects.filter(name=F('b__name'))

    Q查询,相比F查询,Q组合查询应用十分广泛,甚至你的查询只需要一个filter和Q,就够了

    需导入

    from django.db.models import Q

    本来filter( ) 方法中的关键字,都是按‘与’的关系进行查找的,如果你需要 ‘或’ 的关系,你就得用Q了

    Q对象用于封装一组关键字参数,这些关键字参数就可以作为filter()的参数

    重点是Q对象可以使用  |  或者  &  连接成一个新的Q对象,还支持用  ~   符号取反

    需要注意:Q对象可以和其他关键字参数一起作为filter的参数,但是Q对象必须放在一个位置

    示例:查询a表中id大于4,以‘张’开头,或者价格大于10000的数据

    a.objects.filter((Q(name__startwith=''),Q(id__gt=4))|Q(price__gt=10000))

    延伸:

    因为filter接收的参数是关键字参数,所以在实际项目应用中,我们可以单独处理这个关键字参数,比如写成一个字典dict,然后filter(**dict) 就可以应用我们写在字典中的参数了

    如果是Q对象,就不用**了

     用Q对象做字典的元素时,如果是‘或’的关系,需要这样写

    con = Q()
    con.connector = 'OR'
    key = ......
    val = .......
    
    con.children.append((key,val))
    
    dict = {‘key2’:‘val2’}

    data_list = a.objects.filter(**dict).filter(con)  # 这句话表明了filter后面可以跟的参数,一个是字典,另一种就是Q 对象
  • 相关阅读:
    【Kubernetes学习之一】Kubernetes 简介
    eclipse&myeclipse 生成jar包后,spring无法扫描到bean定义
    【Docker学习之七】Docker图形化管理和监控
    【Docker学习之六】Docker容器互联
    【Docker学习之五】Docker自定义镜像示例
    【Docker学习之四】Docker自定义容器镜像
    【Docker学习之三】Docker查找拉取镜像、启动容器、容器使用
    【Docker学习之二】Docker部署安装
    Tensorflow之tf.metrics
    pytorch 实现多分类
  • 原文地址:https://www.cnblogs.com/zhang-can/p/7745809.html
Copyright © 2020-2023  润新知