Django学习总结②----关系运算与F,Q关系
关联mysql步骤:
第一步:下载pymysql:pip install pymysql
第二步:在工程目录下的init文件下,将pymysql引入
import pymysql
pymysql.install..
第三步:在工程目录下的settings文件下,找到databases配置信息
将配置信息更改为mysql配置
'ENGINE':'django.db.backends.mysql',
'NAME':'Learn',
'USER':'root',
'PASSWORD':'rock1204',
'HOST':'localhost',
'PORT':'3306',
第四步:我们需要通过mysql创建一个名字相同的数据库以便链接
第五步:可以通过models生成数据库迁移文件
urls配置:
如果出现多个APP 这是我们怎么urls
第一步:在每个APP里面创建一个urls.py文件,然后将每个APP
的自己的url放到这个文件里
第二步:在工程目录下,对url进行管理,对应的APP,用include进行包含操作
templates配置:
如果templates包出现在了工程级目录下,需要配置一个路径以便于告诉所有的APP
到我的工程目录下调用templates
os.path.join(BASE_DIR,'templates')
当我们拿到查询结果集时,如果我们利用切片操作,拿到我们需要的几个
但是剩下的是以缓存的形式存在于内存中,这个时候,如果你再次去切片结果
他会直接从缓存中进行操作,而不再进行数据库的查询
创建数据库的时候 >务必记得设置编码格式
create database 数据库名 charset utf8;
- Django运算表达式与Q对象/F对象
1 模型查询
概述:
1 查询集:表示从数据库中获取的对象的集合
2 查询集可以有多个过滤器,通过 逻辑运算符连接
3 过滤器就是一个函数,基于所给的参数限制查询的结果,类似MySQL模糊查询中where语句
4 查询集等同select语句12345
2 查询集
特点:
1 查询集通过调用过滤器方进行查询, 查询集经过过滤器筛选后返回新的查询集,可以链式调用
2 惰性执行 创建查询集不会带来任何数据库的访问直到调用数据库才会访问
返回单个数据查询:
get() 返回一个满足条件的对象
注意:没有找到符合条件的对象,模型类引发异常 模型类.DoesNotExists异常
如果找到多个对象也会引发异常 模型类.MultipleObjectsReturned
count() 返回查询集中的对象个数
first() 返回第一个查询集对象
last() 返回最后一个查询集对象
exists() 查询集是否有数据,如果有数据返回true
限制查询集:查询集返回的是列表,可以采用下标的方法进行限制,等同于sql中的limit语句
studentList = Student.objects.all()[0:5]
查询集缓存 : 每个查询集都包含一个缓存,来最小化的对数据库访问。在新建的查询集中,缓存首
次为空,第一次对查询集求值,django会将数据缓存,并返回结果,以后结果直接使用缓存集的数据
12345678910111213141516171819
3 常见过滤器
all() 返回所有对象
filter() filter(键=值,键=值) 且关系
返回符合条件的数据
filter(键=值),filter(键=值)
exclude() 过滤掉符合条件数据
order_by() 排序
values() 一条数据就是是一个对象(字典),返回一个列表1234567
4 比较运算符
(1)概述: 实现where语句,作为filter() exclude() get()的参数
语法: 属性名称__运算符 = 值
外键: 属性名_id
转义: 类似like语句,是为了匹配占位,匹配数据中的%,sql中where like '\%'
filter(sname__contains = '%')
(2)常见的比较运算符:
exact 判断,大小写敏感
filter(isDelete=False)
contains 是否包含,大小写敏感
stuList = Student.objects.filter(sname__contains ='孙' )
startswith 以value开头,大小写敏感
stuList = Student.objects.filter(sname__startswith ='孙' )
endwith 以value结尾,大小写敏感
in 是否包含在范围内 filter(pk__in=[2,4,6,8,10])
注: 以上四个前面加上i,就表示不区分大小写,iexact,icontains,istartswith,iendswith
(3) 其他形式查询
为空判断:
isnull ,isnotnull 是否为空 filter(sname__isnull=Flase)
比较运算:
gt 大于
gte 大于等于
lt 小于
lte 小于等于
filter(sage_gt=30)年龄大于30
时间查询:
year/month/day/week_day/hour/minute/second filter(lastTime__year=2017)
跨关查询 处理join查询 模型类型__属性名__运算符(可选)
查询快捷 pk 代表的主键 123456789101112131415161718192021222324252627282930
5 F对象与Q对象
常见的聚合函数:
使用aggregate()函数返回聚合函数的值
Avg Count Max Min sum
from dango.db.models import Max
maxAge = Student.objects.aggregate(Max('sage')) 找出学生年龄最大的
F对象
1 可以使用模型的A属性与B属性进行比较
from django.db.models import F,Q
def grades(request):
g = Grades.objects.filter(ggirlnum_gt=F('gboynum')) 找到女生人输大于男生人数的班级
2 支持F对象的算术运算 filter(ggirlnum_gt=F('gboynum')+20)
3 F对象的参数可以是跨表字段
models.Book.objects.filter(bread_num=F(''author_name'))
4 F对象参数如果是date/time,可以进行日期的加减运算:
models.Book.objects.filter(bpub_date__lt=F('bpub_date') + timedelta(days=5))
Q对象
概述 过滤器的方法中的关键字参数,,条件为And模式,采用逻辑或引入Q对象
需求 进行or查询,或查询
解决 使用Q对象
Q对象可以使用&(and)、|(or)操作符组合起来
studentList = Student.objects.filter(Q(pk__lt = 3)|Q(sage__gt=50)) pk_id小于3或年龄大于50岁
models.User.objects.filter(Q(username='老王') & Q(userpass='admin')) 条件与组合
models.User.objects.filter(~Q(username='老王')) 条件非表示取反
可以使用 &(and) |(or) ~(not) 结合括号进行分组,构造更复杂的Q对象
filter函数可以传递一个或多个Q对象作为位置参数,如果有多个Q对象,这些参数的逻辑为and
下面分享一个综合用法:
def get(self, request, *args, **kwargs):
filters = request.GET
#找出符合customer的数据转成列表
Qs = [Q(customer=request.user.customer)]
try:
if 'limit' in filters:
limit = abs(int(filters['limit']))
if limit > 50:
limit = 50
else:
limit = 15
start_id = int(filters.get('start_id', 0))
#添加符合start_id的对象
Qs.append(Q(id__gt=start_id))
#添加符合状态的state
if 'state' in filters:
Qs.append(Q(state__in=filters['state']))
else:
Qs.append(Q(state__in=[0, 1, 2, 3, 4]))
#添加符合title的数据
if 'title' in filters:
Qs.append(Q(title__contains=filters['title']))
except Exception:
return params_error({"filters": "过滤参数不合法"})
#通过*Qs,对列表数据同时满足上述情况的数据进行总的帅选,并设置限制集
sets = Questionnaire.objects.filter(*Qs)[:limit]
Django学习总结②----关系运算与F,Q关系的更多相关文章
- 八、django学习之分组查询、F查询和Q查询
分组查询.F查询和Q查询 分组查询 统计每个出版社出版的书籍的平均价格 第一种方式 obj = models.Book.objects.values('publishs_id').annotate(a ...
- Django学习——图书相关表关系建立、基于双下划线的跨表查询、聚合查询、分组查询、F查询、Q查询、admin的使用、使用脚本调用Django、Django查看源生sql
0 图书相关表关系建立 1.5个表 2.书籍表,作者表,作者详情表(垂直分表),出版社表,书籍和作者表(多对多关系) 一对一 多对多 本质都是一对多 外键关系 3.一对一的关系,关联字段可以写在任意一 ...
- Django运算表达式与Q对象/F对象
Django运算表达式与Q对象/F对象 1 模型查询 概述: 1 查询集:表示从数据库中获取的对象的集合 2 查询集可以有多个过滤器,通过 逻辑运算符连接 3 过滤器就是一个函数,基于所给的参数限制查 ...
- Django 学习 之ORM聚合查询分组查询与F查询与Q查询
一.聚合查询和分组查询 1.聚合查询aggregate 关于数据表的数据请见上一篇:Django 学习 之ORM多表操作(点我) aggregate(*args, **kwargs),只对一个组进行聚 ...
- Django框架08 /聚合查询、分组、F/Q查询、原生sql相关
Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 目录 Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 1. 聚合查询 2. 分组 3. F查询和Q查询 4. o ...
- day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号
python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...
- Django之ORM操作(聚合 分组、F Q)
Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作. 键的名 ...
- $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数
一.聚合函数 from django.db.models import Avg,Sum,Max,Min,Count,F,Q #导入 # .查询图书的总价,平均价,最大价,最小价 ...
- Django之model F/Q以及多对多操作
model之F/Q操作 F操作,使用查询条件的值 打个比方吧,有一张表,保存着公司员工的工资,公司普涨工资,如何在model中操作,这就用到了F,首先需要导入此模块: from django.db.m ...
随机推荐
- 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...
- init/loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
init/loadView/viewDidLoad/viewDidUnload 这么细节的东西想来大家都不在意,平时也不会去关系,但是在面试时却常常被提到,所以了解viewController的生命周 ...
- Swift_可选链
Swift_可选链 点击查看源码 //可选链 func test() { class Person { //可选属性可能为nil或Residence类 var residence: Residence ...
- 学习笔记(1)centos7 下安装nginx
学习笔记(1)centos7 下安装nginx 这里我是通过来自nginx.org的nginx软件包进行安装的. 1.首先为centos设置添加nginx的yum存储库 1.通过vi命令创建一个rep ...
- 【LightOJ 1081】Square Queries(二维RMQ降维)
Little Tommy is playing a game. The game is played on a 2D N x N grid. There is an integer in each c ...
- 03.安装jdk8作为系统环境
博客为日常工作学习积累总结: 1.安装JDK8 创建安装目录:mkdir /application/java8 解压-安装包自行下载:tar -zxf jdk-8u202-linux-x64.tar. ...
- jQuery实现 自动滚屏操作
实现自动滚屏思路: 1.滚屏即:文本的往上移动一段距离: 2.那么我们使文本每过一段时间就往上移动一段固定距离,就可实现滚屏: 3.直到文本底部出现在浏览器窗口中,专业点就是 文本移动的距离 + 浏览 ...
- Vuex的第一次接触
前言:最近在做Vue实现去哪网,想要实现在城市列表页面,点击某个城市的时候,主页的头部的城市会随着改变,就是首页和城市页面有共用的数据要分享,这里使用Vuex 1. Vuex是什么? 是Vue官方推荐 ...
- jQuery获取Select option 选择的Text和 Value
获取一组radio被选中项的值:var item = $('input[name=items][checked]').val();获取select被选中项的文本var item = $("s ...
- 20190121-n个人围成一圈,凡报到3的人退出圈子,最后留下的是原来第几号的那位
1. 报数问题:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位 思路:此题主要问题在于但凡报到3的人退出圈子,而报数的号码与圈子的 ...