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 对象
Python数据库查询之组合条件查询-F&Q查询的更多相关文章
- python-day71--django多表双下划线查询及分组聚合及F/Q查询
#====================================双下划线的跨表查询===============# 前提 此时 related_name=bookList 属性查询: # 查 ...
- 模型层字段-多表查询-神奇的双下划线查询-F,Q查询
Django ORM中常用的字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. In ...
- Django ORM (四) annotate,F,Q 查询
annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合. from django.shortcuts import re ...
- Django框架08 /聚合查询、分组、F/Q查询、原生sql相关
Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 目录 Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 1. 聚合查询 2. 分组 3. F查询和Q查询 4. o ...
- Django day08 多表操作 (五) 聚合,分组查询 和 F,Q查询
一:聚合,分组查询 二:F, Q查询
- 分组\聚合\F\Q查询
一.分组和聚合查询 1.aggregate(*args,**kwargs) 聚合函数 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每一个参数都指定一个包含在字典中的 ...
- 聚合查询、分组查询、F&Q查询
一.聚合查询和分组查询 1.aggregate(*args, **kwargs): 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每个参数都指定一个包含在字典中的返回值 ...
- orm中的聚合函数,分组,F/Q查询,字段类,事务
目录 一.聚合函数 1. 基础语法 2. Max Min Sum Avg Count用法 (1) Max()/Min() (2)Avg() (3)Count() (4)聚合函数联用 二.分组查询 1. ...
- $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数
一.聚合函数 from django.db.models import Avg,Sum,Max,Min,Count,F,Q #导入 # .查询图书的总价,平均价,最大价,最小价 ...
随机推荐
- 在Ubuntu中部署并测试Fabric 1.0 Beta
[更新:1.0Beta已经是过去式了,现在出了1.0.0的正式版,请大家参照 http://www.cnblogs.com/studyzy/p/7437157.html 安装Fabric 1.0.0 ...
- wampserver启动不起来的原因?
如果没怎么动wamp的配置文件就发现wampserver启动不起来了,那么可能你碰到了iis服务器. 原因是apache的端口占用的是80,而iis的端口占用也是80所以造成了不能启动wampserv ...
- 移动商城第四篇【Controller配置、添加品牌之文件上传和数据校验】
Controller层配置 编写SpringMVC的配置文件 springmvc.xml <?xml version="1.0" encoding="UTF-8&q ...
- bookStore第三篇【用户模块、购买模块、订单模块】
用户模块 要登陆后才能购买,因此我们先写购买模块 设计实体 private String id; private String username; private String password; p ...
- String StringBuffer StringBuilder 之间的区别
StringBuffer与StringBuilder的区别: StringBuffer是jdk1.0版本出来的,线程安全,效率低 StringBuilder是jdk1.5版本出来的,线程不安全,效率高 ...
- Postman 串行传参和动态传参详解
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 用Postman做接口测试的时候,要把多条用例一起执行,就需要把用例连接起来,一次性执行 目录 串行传参 动态传参 使用 ...
- win7旗舰版最新激活密钥
Win7旗舰.企业.专业版的激活密钥(32位.64位均可用).FJGCP-4DFJD-GJY49-VJBQ7-HYRR2 AcerVQ3PY-VRX6D-CBG4J-8C6R2-TCVBD Alien ...
- 【POJ】2348 Euclid's Game(扩欧)
Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first pl ...
- Python自学笔记-字符串编码(来自廖雪峰的官网Python3)
感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 1.理解变 ...
- web前端面试官挖的那些坑(js)
题目1: function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () ...