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 对象

Python数据库查询之组合条件查询-F&Q查询的更多相关文章

  1. python-day71--django多表双下划线查询及分组聚合及F/Q查询

    #====================================双下划线的跨表查询===============# 前提 此时 related_name=bookList 属性查询: # 查 ...

  2. 模型层字段-多表查询-神奇的双下划线查询-F,Q查询

    Django ORM中常用的字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. In ...

  3. Django ORM (四) annotate,F,Q 查询

    annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合. from django.shortcuts import re ...

  4. Django框架08 /聚合查询、分组、F/Q查询、原生sql相关

    Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 目录 Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 1. 聚合查询 2. 分组 3. F查询和Q查询 4. o ...

  5. Django day08 多表操作 (五) 聚合,分组查询 和 F,Q查询

    一:聚合,分组查询 二:F, Q查询

  6. 分组\聚合\F\Q查询

    一.分组和聚合查询 1.aggregate(*args,**kwargs)  聚合函数 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每一个参数都指定一个包含在字典中的 ...

  7. 聚合查询、分组查询、F&Q查询

    一.聚合查询和分组查询 1.aggregate(*args, **kwargs): 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每个参数都指定一个包含在字典中的返回值 ...

  8. orm中的聚合函数,分组,F/Q查询,字段类,事务

    目录 一.聚合函数 1. 基础语法 2. Max Min Sum Avg Count用法 (1) Max()/Min() (2)Avg() (3)Count() (4)聚合函数联用 二.分组查询 1. ...

  9. $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数

        一.聚合函数    from django.db.models import Avg,Sum,Max,Min,Count,F,Q   #导入    # .查询图书的总价,平均价,最大价,最小价 ...

随机推荐

  1. Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)论文 | ApacheCN

    Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...

  2. (一)关于java泛型的学习总结(泛型方法、泛型擦除)

    目录概要 一.泛型方法 二.利用泛型方法的特性实现代码的简化 三. 关于泛型的擦除 四.无界通配符和原生类型区别 五.转型和警告   泛型 一般的类中的属性或方法的参数,只能使用具体的类型:要么是基本 ...

  3. 前端里移动端到底比pc端多哪些知识?

    端里移动端到底比pc端多哪些知识,为啥面试时好多公司都问h5水平如何? 我做过几年的web前端开发,就简单谈谈自己的感受吧.首先来看看PC端和移动端在前端开发上的一些区别:(1)PC考虑的是浏览器兼容 ...

  4. String类的替换方法(9)

    1:String replace(char old,char new) 2:   String replace(String old,String new) 3:   trim();//去除字符串空格 ...

  5. python进阶之Socket 网络编程

     一:网络编程介绍   自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两 ...

  6. js 倒计时(服务器时间同步)

    首先说一下,为什么要服务器时间同步, 因为服务器时间和本地电脑时间存在一定的时间差.有些对时效性要求非常高的应用,例如时时彩开奖,是不能容忍这种时间差存在的. 方案1:每次倒计时去服务端请求时间 // ...

  7. oracle 权限

    一.介绍这一部分我们主要看看oracle中如何管理权限和角色,权限和角色的区别在哪里.当刚刚建立用户时,用户没有任何权限,也不能执行任何操作.如果要执行某种特定的数据库操作,则必须为其授予系统的权限: ...

  8. AngularJS 1.3中的一次性数据绑定(one-time bindings)

    点击查看AngularJS系列目录 谈谈AngularJS 1.3中的一次性数据绑定(one-time bindings) 不久之前,AngularJS 1.3版本正式发布,其中添加了很多的性特性,同 ...

  9. 微信小程序-发送模板消息(C#)

    步骤一:获取模板ID 有两个方法可以获取模版ID 通过模版消息管理接口获取模版ID 在微信公众平台手动配置获取模版ID 步骤二:页面的 <form/> 组件,属性report-submit ...

  10. vector 向量容器用法祥解

    vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法:         ...