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 ...
随机推荐
- ViewController里的loadView和viewDidLoad什么区别
当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法.这个方法就会加载或者创建一个view对象 ...
- asp.net mvc HtmlHelperExt EnumDropDownList
public static class HtmlHelperExt { public static MvcHtmlString EnumDropDownList<TEnum>(this H ...
- java连接linux的三种方式(附执行命令)
# 本地调用使用JDK自带的RunTime类和Process类实现 public static void main(String[] args){ Process proc = RunTime.get ...
- Oracle查找lobsegment、lobindex对应的表
在查看表空间的使用情况的时候,发现有几个LOBSEGMENT.LOBINDEX类型的对象占用了大量的空间.于是想找出那些表占用了大量的空间,以便于清理. Oracle对BLOB类型的定义 ...
- lead over 和 lag over
今天在熟悉项目的某个功能模块时,查看mybatis的映射文件内发现这样的一串sql: (T.NET_VALUE - LEAD(T.NET_VALUE)OVER(ORDER BY T.ESTIMATE_ ...
- OS--lab0+lab1+lab4+lab5+lab6+lab7
URL:https://github.com/Chasssser/MytestOR(Linux) git clone https://github.com/Chasssser/Mytest
- mysql启动错误处理
1.当启动MySQL时,报如下错误 [ERROR] Plugin 'InnoDB' init function returned error.[ERROR] Plugin 'InnoDB' regis ...
- 【设计模式】Java之单例设计模式
1.单例设计模式:一个类只能有一个对象 1.1 创建单例类的步骤: 1.将构造方法私有化 2.创建私有的静态成员变量 3.共有的静态成员方法,提供当前的唯一对象 1.1 创建单例的两种方式: 1.饿汉 ...
- 查看Pyton的版本号和32/64位平台
怎么查看Python的版本号?使用的Python是32位还是64位的?用以下两条Python 指令就可以知道. 方法1:通过Python代码查看 import platform import sys ...
- Django的安装创建与连接数据库
HTTP协议简介 HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP).通过使用网 页浏览器.网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端 口为 ...